<?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>93126</bug_id>
          
          <creation_ts>2012-08-03 08:29:17 -0700</creation_ts>
          <short_desc>Web Inspector: Create an interface for TextEditor</short_desc>
          <delta_ts>2012-08-03 12:33:49 -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>Web Inspector (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Jan Keromnes">janx</reporter>
          <assigned_to name="Jan Keromnes">janx</assigned_to>
          <cc>apavlov</cc>
    
    <cc>bweinstein</cc>
    
    <cc>caseq</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>rik</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>686765</commentid>
    <comment_count>0</comment_count>
    <who name="Jan Keromnes">janx</who>
    <bug_when>2012-08-03 08:29:17 -0700</bug_when>
    <thetext>For more extensibility, TextEditor needs to be made an interface, that a new class DefaultTextEditor can implement. This will allow further text editor classes, e.g. CodeMirrorTextEditor or ExtensionTextEditor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>686824</commentid>
    <comment_count>1</comment_count>
      <attachid>156396</attachid>
    <who name="Jan Keromnes">janx</who>
    <bug_when>2012-08-03 09:22:53 -0700</bug_when>
    <thetext>Created attachment 156396
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>687035</commentid>
    <comment_count>2</comment_count>
      <attachid>156396</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-03 12:33:45 -0700</bug_when>
    <thetext>Comment on attachment 156396
Patch

Clearing flags on attachment: 156396

Committed r124638: &lt;http://trac.webkit.org/changeset/124638&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>687036</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-03 12:33:49 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>156396</attachid>
            <date>2012-08-03 09:22:53 -0700</date>
            <delta_ts>2012-08-03 12:33:44 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-93126-20120803202232.patch</filename>
            <type>text/plain</type>
            <size>196680</size>
            <attacher name="Jan Keromnes">janx</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI0NjE3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjAxNzE2Y2ZhOTUzNTky
NjVlMTU2ZGI3Mjg1NjI1ZmVjMDFhMWQ4Ny4uMDk0YjI5ZjExZTEyNTM1NjYxMTFjMTY4ZGZlN2Iz
YzA4MWMyZjI4NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU2IEBACisyMDEyLTA4LTAzICBKYW4g
S2Vyb21uZXMgIDxqYW54QGxpbnV4LmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9yOiBDcmVh
dGUgYW5kIGludGVyZmFjZSBmb3IgVGV4dEVkaXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTMxMjYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBGb3IgbW9yZSBleHRlbnNpYmlsaXR5LCBUZXh0RWRpdG9y
IG5lZWRzIHRvIGJlIGFuIGludGVyZmFjZSB0aGF0IG90aGVyCisgICAgICAgIGNsYXNzZXMgY2Fu
IGltcGxlbWVudCwgZS5nLiB0aGUgbmV3IGNsYXNzIERlZmF1bHRUZXh0RWRpdG9yLgorCisgICAg
ICAgICogV2ViQ29yZS5neXBpOgorICAgICAgICAqIFdlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNw
cm9qOgorICAgICAgICAqIGluc3BlY3Rvci9jb21waWxlLWZyb250LWVuZC5weToKKyAgICAgICAg
KiBpbnNwZWN0b3IvZnJvbnQtZW5kL1NvdXJjZUZyYW1lLmpzOgorICAgICAgICAoV2ViSW5zcGVj
dG9yLlNvdXJjZUZyYW1lKToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0
b3IuanM6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvcik6CisgICAgICAgIChXZWJJ
bnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUuc2V0IG1pbWVUeXBlKToKKyAgICAgICAgKFdl
Ykluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlwZS5zZXRSZWFkT25seSk6CisgICAgICAgIChX
ZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUucmVhZE9ubHkpOgorICAgICAgICAoV2Vi
SW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlLmRlZmF1bHRGb2N1c2VkRWxlbWVudCk6Cisg
ICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUucmV2ZWFsTGluZSk6Cisg
ICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUuYWRkRGVjb3JhdGlvbik6
CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUucmVtb3ZlRGVjb3Jh
dGlvbik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUubWFya0Fu
ZFJldmVhbFJhbmdlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlw
ZS5oaWdobGlnaHRMaW5lKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3Rv
dHlwZS5jbGVhckxpbmVIaWdobGlnaHQpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0
b3IucHJvdG90eXBlLmZyZWVDYWNoZWRFbGVtZW50cyk6CisgICAgICAgIChXZWJJbnNwZWN0b3Iu
VGV4dEVkaXRvci5wcm90b3R5cGUuZWxlbWVudHNUb1Jlc3RvcmVTY3JvbGxQb3NpdGlvbnNGb3Ip
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlLmluaGVyaXRTY3Jv
bGxQb3NpdGlvbnMpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBl
LmJlZ2luVXBkYXRlcyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5
cGUuZW5kVXBkYXRlcyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5
cGUub25SZXNpemUpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBl
Ll90ZXh0Q2hhbmdlZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5
cGUuZWRpdFJhbmdlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlw
ZS5zY3JvbGxUb0xpbmUpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90
eXBlLnNlbGVjdGlvbik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5
cGUubGFzdFNlbGVjdGlvbik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90
b3R5cGUuc2V0U2VsZWN0aW9uKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnBy
b3RvdHlwZS5zZXRUZXh0KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3Rv
dHlwZS50ZXh0KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlwZS5y
YW5nZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUubGluZSk6
CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUuZ2V0IGxpbmVzQ291
bnQpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlLnNldEF0dHJp
YnV0ZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUuZ2V0QXR0
cmlidXRlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlwZS5yZW1v
dmVBdHRyaWJ1dGUpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBl
Lndhc1Nob3duKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlwZS5f
aGFuZGxlRm9jdXNlZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5
cGUud2lsbEhpZGUpOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvV2ViS2l0LnFyYzoK
KyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sOgorCiAyMDEyLTA4
LTAzICBQaGlsaXBwZSBOb3JtYW5kICA8cG5vcm1hbmRAaWdhbGlhLmNvbT4KIAogICAgICAgICBV
bnJldmlld2VkLCByb2xsaW5nIG91dCByMTI0NjE0LgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5neXBpIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IGQwYThl
MGM5NWNhOTdmMTBlZTAyYzZiOWYwOTNkNDM4YWVmYjA0NzYuLmJlOTNlNjFlYmVlNzkzNjg5M2Zj
N2VhMGJhMzQ0NDc0ZDM5MTZmNTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
Z3lwaQorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKQEAgLTYyNzgsNiArNjI3OCw3
IEBACiAgICAgICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9EYXRhR3JpZC5qcycsCiAgICAg
ICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9EZWJ1Z2dlck1vZGVsLmpzJywKICAgICAgICAg
ICAgICdpbnNwZWN0b3IvZnJvbnQtZW5kL0RlYnVnZ2VyU2NyaXB0TWFwcGluZy5qcycsCisgICAg
ICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9EZWZhdWx0VGV4dEVkaXRvci5qcycsCiAgICAg
ICAgICAgICAnaW5zcGVjdG9yL2Zyb250LWVuZC9EaWFsb2cuanMnLAogICAgICAgICAgICAgJ2lu
c3BlY3Rvci9mcm9udC1lbmQvRGlyZWN0b3J5Q29udGVudFZpZXcuanMnLAogICAgICAgICAgICAg
J2luc3BlY3Rvci9mcm9udC1lbmQvRE9NQWdlbnQuanMnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2ogYi9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagppbmRleCA3ZWMyNDNiMDRkNDFhN2QzYWU5NGJiMDdj
MmNhYjdiYjEwZjk5MzJkLi41NzMxYThmNzY5MmQxNzZjN2JjZDhlOWUyOWRhOTE1NTk1YThmNjQ0
IDEwMDc1NQotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJv
agorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagpAQCAt
NzU0MjIsNiArNzU0MjIsMTAgQEAKIAkJCQkJPgogCQkJCTwvRmlsZT4KIAkJCQk8RmlsZQorCQkJ
CQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1lbmRcRGVmYXVsdFRleHRFZGl0b3Iu
anMiCisJCQkJCT4KKwkJCQk8L0ZpbGU+CisJCQkJPEZpbGUKIAkJCQkJUmVsYXRpdmVQYXRoPSIu
LlxpbnNwZWN0b3JcZnJvbnQtZW5kXGRpYWxvZy5jc3MiCiAJCQkJCT4KIAkJCQk8L0ZpbGU+CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvY29tcGlsZS1mcm9udC1lbmQucHkg
Yi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvY29tcGlsZS1mcm9udC1lbmQucHkKaW5kZXggZTUw
ZTUyNGJhNmNkYjJiNGY1ZWQ5NGZjNjM3MGE4NDQyZGY1MTY3ZS4uYmMwNjg3N2UyZTFkNDA1MWVm
ODUxYzM4NDMyMzIyNzY3NTcxYWRhNCAxMDA3NTUKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVj
dG9yL2NvbXBpbGUtZnJvbnQtZW5kLnB5CisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9j
b21waWxlLWZyb250LWVuZC5weQpAQCAtMTIwLDYgKzEyMCw3IEBAIG1vZHVsZXMgPSBbCiAgICAg
ICAgICAgICAiQ29va2llc1RhYmxlLmpzIiwKICAgICAgICAgICAgICJET01TeW50YXhIaWdobGln
aHRlci5qcyIsCiAgICAgICAgICAgICAiRGF0YUdyaWQuanMiLAorICAgICAgICAgICAgIkRlZmF1
bHRUZXh0RWRpdG9yLmpzIiwKICAgICAgICAgICAgICJEaWFsb2cuanMiLAogICAgICAgICAgICAg
IkRyYXdlci5qcyIsCiAgICAgICAgICAgICAiRW1wdHlWaWV3LmpzIiwKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRGVmYXVsdFRleHRFZGl0b3IuanMgYi9T
b3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0RlZmF1bHRUZXh0RWRpdG9yLmpzCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLjMyMjQxZTQzNjQxMmIyODJhMTc0N2ExMTU4ZDBmNGZmMjNlZjc4NGIKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0RlZmF1bHRU
ZXh0RWRpdG9yLmpzCkBAIC0wLDAgKzEsMjcyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEw
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICog
TmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICog
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKioKKyAqIEBjb25zdHJ1Y3RvcgorICogQGV4
dGVuZHMge1dlYkluc3BlY3Rvci5WaWV3fQorICogQGltcGxlbWVudHMge1dlYkluc3BlY3Rvci5U
ZXh0RWRpdG9yfQorICogQHBhcmFtIHs/c3RyaW5nfSB1cmwKKyAqIEBwYXJhbSB7V2ViSW5zcGVj
dG9yLlRleHRFZGl0b3JEZWxlZ2F0ZX0gZGVsZWdhdGUKKyAqLworV2ViSW5zcGVjdG9yLkRlZmF1
bHRUZXh0RWRpdG9yID0gZnVuY3Rpb24odXJsLCBkZWxlZ2F0ZSkKK3sKKyAgICBXZWJJbnNwZWN0
b3IuVmlldy5jYWxsKHRoaXMpOworICAgIHRoaXMuX2RlbGVnYXRlID0gZGVsZWdhdGU7CisgICAg
dGhpcy5fdXJsID0gdXJsOworCisgICAgdGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCJ0ZXh0RWRp
dG9yLmNzcyIpOworCisgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9ICJ0ZXh0LWVkaXRvciBt
b25vc3BhY2UiOworCisgICAgdGhpcy5fdGV4dE1vZGVsID0gbmV3IFdlYkluc3BlY3Rvci5UZXh0
RWRpdG9yTW9kZWwoKTsKKyAgICB0aGlzLl90ZXh0TW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihXZWJJ
bnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLkV2ZW50cy5UZXh0Q2hhbmdlZCwgdGhpcy5fdGV4dENo
YW5nZWQsIHRoaXMpOworICAgIHRoaXMuX3RleHRNb2RlbC5yZXNldFVuZG9TdGFjaygpOworCisg
ICAgdmFyIGVudGVyVGV4dENoYW5nZU1vZGUgPSB0aGlzLl9lbnRlckludGVybmFsVGV4dENoYW5n
ZU1vZGUuYmluZCh0aGlzKTsKKyAgICB2YXIgZXhpdFRleHRDaGFuZ2VNb2RlID0gdGhpcy5fZXhp
dEludGVybmFsVGV4dENoYW5nZU1vZGUuYmluZCh0aGlzKTsKKyAgICB2YXIgc3luY1Njcm9sbExp
c3RlbmVyID0gdGhpcy5fc3luY1Njcm9sbC5iaW5kKHRoaXMpOworICAgIHZhciBzeW5jRGVjb3Jh
dGlvbnNGb3JMaW5lTGlzdGVuZXIgPSB0aGlzLl9zeW5jRGVjb3JhdGlvbnNGb3JMaW5lLmJpbmQo
dGhpcyk7CisgICAgdmFyIHN5bmNMaW5lSGVpZ2h0TGlzdGVuZXIgPSB0aGlzLl9zeW5jTGluZUhl
aWdodC5iaW5kKHRoaXMpOworICAgIHRoaXMuX21haW5QYW5lbCA9IG5ldyBXZWJJbnNwZWN0b3Iu
VGV4dEVkaXRvck1haW5QYW5lbCh0aGlzLl90ZXh0TW9kZWwsIHVybCwgc3luY1Njcm9sbExpc3Rl
bmVyLCBzeW5jRGVjb3JhdGlvbnNGb3JMaW5lTGlzdGVuZXIsIGVudGVyVGV4dENoYW5nZU1vZGUs
IGV4aXRUZXh0Q2hhbmdlTW9kZSk7CisgICAgdGhpcy5fZ3V0dGVyUGFuZWwgPSBuZXcgV2ViSW5z
cGVjdG9yLlRleHRFZGl0b3JHdXR0ZXJQYW5lbCh0aGlzLl90ZXh0TW9kZWwsIHN5bmNEZWNvcmF0
aW9uc0ZvckxpbmVMaXN0ZW5lciwgc3luY0xpbmVIZWlnaHRMaXN0ZW5lcik7CisKKyAgICB0aGlz
Ll9tYWluUGFuZWwuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCB0aGlzLl9oYW5k
bGVTY3JvbGxDaGFuZ2VkLmJpbmQodGhpcyksIGZhbHNlKTsKKyAgICB0aGlzLl9tYWluUGFuZWwu
X2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsIHRoaXMuX2hhbmRsZUZvY3VzZWQu
YmluZCh0aGlzKSwgZmFsc2UpOworCisgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMu
X21haW5QYW5lbC5lbGVtZW50KTsKKyAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5f
Z3V0dGVyUGFuZWwuZWxlbWVudCk7CisKKyAgICAvLyBGb3J3YXJkIG1vdXNlIHdoZWVsIGV2ZW50
cyBmcm9tIHRoZSB1bnNjcm9sbGFibGUgZ3V0dGVyIHRvIHRoZSBtYWluIHBhbmVsLgorICAgIGZ1
bmN0aW9uIGZvcndhcmRXaGVlbEV2ZW50KGV2ZW50KQorICAgIHsKKyAgICAgICAgdmFyIGNsb25l
ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIldoZWVsRXZlbnQiKTsKKyAgICAgICAgY2xvbmUuaW5p
dFdlYktpdFdoZWVsRXZlbnQoZXZlbnQud2hlZWxEZWx0YVgsIGV2ZW50LndoZWVsRGVsdGFZLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC52aWV3LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zY3JlZW5YLCBldmVudC5zY3JlZW5ZLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jbGllbnRYLCBldmVudC5j
bGllbnRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jdHJsS2V5
LCBldmVudC5hbHRLZXksIGV2ZW50LnNoaWZ0S2V5LCBldmVudC5tZXRhS2V5KTsKKyAgICAgICAg
dGhpcy5fbWFpblBhbmVsLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChjbG9uZSk7CisgICAgfQorICAg
IHRoaXMuX2d1dHRlclBhbmVsLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIs
IGZvcndhcmRXaGVlbEV2ZW50LmJpbmQodGhpcyksIGZhbHNlKTsKKworICAgIHRoaXMuZWxlbWVu
dC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5faGFuZGxlS2V5RG93bi5iaW5kKHRo
aXMpLCBmYWxzZSk7CisgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRt
ZW51IiwgdGhpcy5fY29udGV4dE1lbnUuYmluZCh0aGlzKSwgdHJ1ZSk7CisKKyAgICB0aGlzLl9y
ZWdpc3RlclNob3J0Y3V0cygpOworfQorCitXZWJJbnNwZWN0b3IuRGVmYXVsdFRleHRFZGl0b3Iu
cHJvdG90eXBlID0geworICAgIC8qKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtaW1lVHlwZQor
ICAgICAqLworICAgIHNldCBtaW1lVHlwZShtaW1lVHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMu
X21haW5QYW5lbC5taW1lVHlwZSA9IG1pbWVUeXBlOworICAgIH0sCisKKyAgICAvKioKKyAgICAg
KiBAcGFyYW0ge2Jvb2xlYW59IHJlYWRPbmx5CisgICAgICovCisgICAgc2V0UmVhZE9ubHk6IGZ1
bmN0aW9uKHJlYWRPbmx5KQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX21haW5QYW5lbC5yZWFk
T25seSgpID09PSByZWFkT25seSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdGhpcy5f
bWFpblBhbmVsLnNldFJlYWRPbmx5KHJlYWRPbmx5LCB0aGlzLmlzU2hvd2luZygpKTsKKyAgICAg
ICAgV2ViSW5zcGVjdG9yLm1hcmtCZWluZ0VkaXRlZCh0aGlzLmVsZW1lbnQsICFyZWFkT25seSk7
CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CisgICAgICovCisg
ICAgcmVhZE9ubHk6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9tYWlu
UGFuZWwucmVhZE9ubHkoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHJldHVybiB7V2Vi
SW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbH0KKyAgICAgKi8KKyAgICBnZXQgdGV4dE1vZGVsKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90ZXh0TW9kZWw7CisgICAgfSwKKworICAgIC8q
KgorICAgICAqIEByZXR1cm4ge0VsZW1lbnR9CisgICAgICovCisgICAgZGVmYXVsdEZvY3VzZWRF
bGVtZW50OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbWFpblBhbmVs
LmRlZmF1bHRGb2N1c2VkRWxlbWVudCgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFy
YW0ge251bWJlcn0gbGluZU51bWJlcgorICAgICAqLworICAgIHJldmVhbExpbmU6IGZ1bmN0aW9u
KGxpbmVOdW1iZXIpCisgICAgeworICAgICAgICB0aGlzLl9tYWluUGFuZWwucmV2ZWFsTGluZShs
aW5lTnVtYmVyKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxp
bmVOdW1iZXIKKyAgICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSBkZWNvcmF0aW9uCisgICAg
ICovCisgICAgYWRkRGVjb3JhdGlvbjogZnVuY3Rpb24obGluZU51bWJlciwgZGVjb3JhdGlvbikK
KyAgICB7CisgICAgICAgIHRoaXMuX21haW5QYW5lbC5hZGREZWNvcmF0aW9uKGxpbmVOdW1iZXIs
IGRlY29yYXRpb24pOworICAgICAgICB0aGlzLl9ndXR0ZXJQYW5lbC5hZGREZWNvcmF0aW9uKGxp
bmVOdW1iZXIsIGRlY29yYXRpb24pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0g
e251bWJlcn0gbGluZU51bWJlcgorICAgICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IGRlY29y
YXRpb24KKyAgICAgKi8KKyAgICByZW1vdmVEZWNvcmF0aW9uOiBmdW5jdGlvbihsaW5lTnVtYmVy
LCBkZWNvcmF0aW9uKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFpblBhbmVsLnJlbW92ZURlY29y
YXRpb24obGluZU51bWJlciwgZGVjb3JhdGlvbik7CisgICAgICAgIHRoaXMuX2d1dHRlclBhbmVs
LnJlbW92ZURlY29yYXRpb24obGluZU51bWJlciwgZGVjb3JhdGlvbik7CisgICAgfSwKKworICAg
IC8qKgorICAgICAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRSYW5nZX0gcmFuZ2UKKyAgICAg
Ki8KKyAgICBtYXJrQW5kUmV2ZWFsUmFuZ2U6IGZ1bmN0aW9uKHJhbmdlKQorICAgIHsKKyAgICAg
ICAgaWYgKHJhbmdlKQorICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24ocmFuZ2UpOworICAg
ICAgICB0aGlzLl9tYWluUGFuZWwubWFya0FuZFJldmVhbFJhbmdlKHJhbmdlKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIKKyAgICAgKi8KKyAg
ICBoaWdobGlnaHRMaW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyKQorICAgIHsKKyAgICAgICAgaWYg
KHR5cGVvZiBsaW5lTnVtYmVyICE9PSAibnVtYmVyIiB8fCBsaW5lTnVtYmVyIDwgMCkKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBsaW5lTnVtYmVyID0gTWF0aC5taW4obGluZU51bWJl
ciwgdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQgLSAxKTsKKyAgICAgICAgdGhpcy5fbWFpblBh
bmVsLmhpZ2hsaWdodExpbmUobGluZU51bWJlcik7CisgICAgfSwKKworICAgIGNsZWFyTGluZUhp
Z2hsaWdodDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFpblBhbmVsLmNsZWFy
TGluZUhpZ2hsaWdodCgpOworICAgIH0sCisKKyAgICBmcmVlQ2FjaGVkRWxlbWVudHM6IGZ1bmN0
aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMuX21haW5QYW5lbC5mcmVlQ2FjaGVkRWxlbWVudHMo
KTsKKyAgICAgICAgdGhpcy5fZ3V0dGVyUGFuZWwuZnJlZUNhY2hlZEVsZW1lbnRzKCk7CisgICAg
fSwKKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0FycmF5LjxFbGVtZW50Pn0KKyAgICAgKi8K
KyAgICBlbGVtZW50c1RvUmVzdG9yZVNjcm9sbFBvc2l0aW9uc0ZvcjogZnVuY3Rpb24oKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIFt0aGlzLl9tYWluUGFuZWwuZWxlbWVudF07CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRFZGl0b3J9IHRleHRFZGl0
b3IKKyAgICAgKi8KKyAgICBpbmhlcml0U2Nyb2xsUG9zaXRpb25zOiBmdW5jdGlvbih0ZXh0RWRp
dG9yKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFpblBhbmVsLmVsZW1lbnQuX3Njcm9sbFRvcCA9
IHRleHRFZGl0b3IuX21haW5QYW5lbC5lbGVtZW50LnNjcm9sbFRvcDsKKyAgICAgICAgdGhpcy5f
bWFpblBhbmVsLmVsZW1lbnQuX3Njcm9sbExlZnQgPSB0ZXh0RWRpdG9yLl9tYWluUGFuZWwuZWxl
bWVudC5zY3JvbGxMZWZ0OworICAgIH0sCisKKyAgICBiZWdpblVwZGF0ZXM6IGZ1bmN0aW9uKCkK
KyAgICB7CisgICAgICAgIHRoaXMuX21haW5QYW5lbC5iZWdpblVwZGF0ZXMoKTsKKyAgICAgICAg
dGhpcy5fZ3V0dGVyUGFuZWwuYmVnaW5VcGRhdGVzKCk7CisgICAgfSwKKworICAgIGVuZFVwZGF0
ZXM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMuX21haW5QYW5lbC5lbmRVcGRhdGVz
KCk7CisgICAgICAgIHRoaXMuX2d1dHRlclBhbmVsLmVuZFVwZGF0ZXMoKTsKKyAgICAgICAgdGhp
cy5fdXBkYXRlUGFuZWxPZmZzZXRzKCk7CisgICAgfSwKKworICAgIG9uUmVzaXplOiBmdW5jdGlv
bigpCisgICAgeworICAgICAgICB0aGlzLl9tYWluUGFuZWwucmVzaXplKCk7CisgICAgICAgIHRo
aXMuX2d1dHRlclBhbmVsLnJlc2l6ZSgpOworICAgICAgICB0aGlzLl91cGRhdGVQYW5lbE9mZnNl
dHMoKTsKKyAgICB9LAorCisgICAgX3RleHRDaGFuZ2VkOiBmdW5jdGlvbihldmVudCkKKyAgICB7
CisgICAgICAgIGlmICghdGhpcy5faW50ZXJuYWxUZXh0Q2hhbmdlTW9kZSkKKyAgICAgICAgICAg
IHRoaXMuX3RleHRNb2RlbC5yZXNldFVuZG9TdGFjaygpOworICAgICAgICB0aGlzLl9tYWluUGFu
ZWwudGV4dENoYW5nZWQoZXZlbnQuZGF0YS5vbGRSYW5nZSwgZXZlbnQuZGF0YS5uZXdSYW5nZSk7
CisgICAgICAgIHRoaXMuX2d1dHRlclBhbmVsLnRleHRDaGFuZ2VkKGV2ZW50LmRhdGEub2xkUmFu
Z2UsIGV2ZW50LmRhdGEubmV3UmFuZ2UpOworICAgICAgICB0aGlzLl91cGRhdGVQYW5lbE9mZnNl
dHMoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4
dFJhbmdlfSByYW5nZQorICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0CisgICAgICogQHJldHVy
biB7V2ViSW5zcGVjdG9yLlRleHRSYW5nZX0KKyAgICAgKi8KKyAgICBlZGl0UmFuZ2U6IGZ1bmN0
aW9uKHJhbmdlLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fZW50ZXJJbnRlcm5hbFRleHRD
aGFuZ2VNb2RlKCk7CisgICAgICAgIHRoaXMuX3RleHRNb2RlbC5tYXJrVW5kb2FibGVTdGF0ZSgp
OworICAgICAgICB2YXIgbmV3UmFuZ2UgPSB0aGlzLl90ZXh0TW9kZWwuZWRpdFJhbmdlKHJhbmdl
LCB0ZXh0KTsKKyAgICAgICAgdGhpcy5fZXhpdEludGVybmFsVGV4dENoYW5nZU1vZGUocmFuZ2Us
IG5ld1JhbmdlKTsKKyAgICAgICAgcmV0dXJuIG5ld1JhbmdlOworICAgIH0sCisKKyAgICBfZW50
ZXJJbnRlcm5hbFRleHRDaGFuZ2VNb2RlOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlz
Ll9pbnRlcm5hbFRleHRDaGFuZ2VNb2RlID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5fZGVsZWdhdGUu
YmVmb3JlVGV4dENoYW5nZWQoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtX
ZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSBvbGRSYW5nZQorICAgICAqIEBwYXJhbSB7V2ViSW5zcGVj
dG9yLlRleHRSYW5nZX0gbmV3UmFuZ2UKKyAgICAgKi8KKyAgICBfZXhpdEludGVybmFsVGV4dENo
YW5nZU1vZGU6IGZ1bmN0aW9uKG9sZFJhbmdlLCBuZXdSYW5nZSkKKyAgICB7CisgICAgICAgIHRo
aXMuX2ludGVybmFsVGV4dENoYW5nZU1vZGUgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5fZGVsZWdh
dGUuYWZ0ZXJUZXh0Q2hhbmdlZChvbGRSYW5nZSwgbmV3UmFuZ2UpOworICAgIH0sCisKKyAgICBf
dXBkYXRlUGFuZWxPZmZzZXRzOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB2YXIgbGluZU51
bWJlcnNXaWR0aCA9IHRoaXMuX2d1dHRlclBhbmVsLmVsZW1lbnQub2Zmc2V0V2lkdGg7CisgICAg
ICAgIGlmIChsaW5lTnVtYmVyc1dpZHRoKQorICAgICAgICAgICAgdGhpcy5fbWFpblBhbmVsLmVs
ZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoImxlZnQiLCAobGluZU51bWJlcnNXaWR0aCArIDIpICsg
InB4Iik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMuX21haW5QYW5lbC5lbGVtZW50
LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJsZWZ0Iik7IC8vIFVzZSBkZWZhdWx0IHZhbHVlIHNldCBp
biBDU1MuCisgICAgfSwKKworICAgIF9zeW5jU2Nyb2xsOiBmdW5jdGlvbigpCisgICAgeworICAg
ICAgICB2YXIgbWFpbkVsZW1lbnQgPSB0aGlzLl9tYWluUGFuZWwuZWxlbWVudDsKKyAgICAgICAg
dmFyIGd1dHRlckVsZW1lbnQgPSB0aGlzLl9ndXR0ZXJQYW5lbC5lbGVtZW50OworICAgICAgICAv
LyBIYW5kbGUgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIGF0IHRoZSBib3R0b20gb2YgdGhlIG1haW4g
cGFuZWwuCisgICAgICAgIHRoaXMuX2d1dHRlclBhbmVsLnN5bmNDbGllbnRIZWlnaHQobWFpbkVs
ZW1lbnQuY2xpZW50SGVpZ2h0KTsKKyAgICAgICAgZ3V0dGVyRWxlbWVudC5zY3JvbGxUb3AgPSBt
YWluRWxlbWVudC5zY3JvbGxUb3A7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7
bnVtYmVyfSBsaW5lTnVtYmVyCisgICAgICovCisgICAgX3N5bmNEZWNvcmF0aW9uc0ZvckxpbmU6
IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCisgICAgeworICAgICAgICBpZiAobGluZU51bWJlciA+PSB0
aGlzLl90ZXh0TW9kZWwubGluZXNDb3VudCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICB2YXIgbWFpbkNodW5rID0gdGhpcy5fbWFpblBhbmVsLmNodW5rRm9yTGluZShsaW5lTnVtYmVy
KTsKKyAgICAgICAgaWYgKG1haW5DaHVuay5saW5lc0NvdW50ID09PSAxICYmIG1haW5DaHVuay5k
ZWNvcmF0ZWQpIHsKKyAgICAgICAgICAgIHZhciBndXR0ZXJDaHVuayA9IHRoaXMuX2d1dHRlclBh
bmVsLm1ha2VMaW5lQUNodW5rKGxpbmVOdW1iZXIpOworICAgICAgICAgICAgdmFyIGhlaWdodCA9
IG1haW5DaHVuay5oZWlnaHQ7CisgICAgICAgICAgICBpZiAoaGVpZ2h0KQorICAgICAgICAgICAg
ICAgIGd1dHRlckNodW5rLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoImhlaWdodCIsIGhlaWdo
dCArICJweCIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGd1dHRlckNodW5r
LmVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoImhlaWdodCIpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgdmFyIGd1dHRlckNodW5rID0gdGhpcy5fZ3V0dGVyUGFuZWwuY2h1bmtG
b3JMaW5lKGxpbmVOdW1iZXIpOworICAgICAgICAgICAgaWYgKGd1dHRlckNodW5rLmxpbmVzQ291
bnQgPT09IDEpCisgICAgICAgICAgICAgICAgZ3V0dGVyQ2h1bmsuZWxlbWVudC5zdHlsZS5yZW1v
dmVQcm9wZXJ0eSgiaGVpZ2h0Iik7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAg
ICogQHBhcmFtIHtFbGVtZW50fSBndXR0ZXJSb3cKKyAgICAgKi8KKyAgICBfc3luY0xpbmVIZWln
aHQ6IGZ1bmN0aW9uKGd1dHRlclJvdykKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9saW5lSGVp
Z2h0U3luY2VkKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoZ3V0dGVyUm93ICYm
IGd1dHRlclJvdy5vZmZzZXRIZWlnaHQpIHsKKyAgICAgICAgICAgIC8vIEZvcmNlIGVxdWFsIGxp
bmUgaGVpZ2h0cyBmb3IgdGhlIGNoaWxkIHBhbmVscy4KKyAgICAgICAgICAgIHRoaXMuZWxlbWVu
dC5zdHlsZS5zZXRQcm9wZXJ0eSgibGluZS1oZWlnaHQiLCBndXR0ZXJSb3cub2Zmc2V0SGVpZ2h0
ICsgInB4Iik7CisgICAgICAgICAgICB0aGlzLl9saW5lSGVpZ2h0U3luY2VkID0gdHJ1ZTsKKyAg
ICAgICAgfQorICAgIH0sCisKKyAgICBfcmVnaXN0ZXJTaG9ydGN1dHM6IGZ1bmN0aW9uKCkKKyAg
ICB7CisgICAgICAgIHZhciBrZXlzID0gV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQuS2V5
czsKKyAgICAgICAgdmFyIG1vZGlmaWVycyA9IFdlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0
Lk1vZGlmaWVyczsKKworICAgICAgICB0aGlzLl9zaG9ydGN1dHMgPSB7fTsKKyAgICAgICAgdmFy
IGNvbW1pdEVkaXRpbmcgPSB0aGlzLl9jb21taXRFZGl0aW5nLmJpbmQodGhpcyk7CisgICAgICAg
IHRoaXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KCJz
IiwgbW9kaWZpZXJzLkN0cmxPck1ldGEpXSA9IGNvbW1pdEVkaXRpbmc7CisKKyAgICAgICAgdmFy
IGhhbmRsZUVudGVyS2V5ID0gdGhpcy5fbWFpblBhbmVsLmhhbmRsZUVudGVyS2V5LmJpbmQodGhp
cy5fbWFpblBhbmVsKTsKKyAgICAgICAgdGhpcy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5LZXli
b2FyZFNob3J0Y3V0Lm1ha2VLZXkoa2V5cy5FbnRlci5jb2RlLCBXZWJJbnNwZWN0b3IuS2V5Ym9h
cmRTaG9ydGN1dC5Nb2RpZmllcnMuTm9uZSldID0gaGFuZGxlRW50ZXJLZXk7CisKKyAgICAgICAg
dmFyIGhhbmRsZVVuZG8gPSB0aGlzLl9tYWluUGFuZWwuaGFuZGxlVW5kb1JlZG8uYmluZCh0aGlz
Ll9tYWluUGFuZWwsIGZhbHNlKTsKKyAgICAgICAgdmFyIGhhbmRsZVJlZG8gPSB0aGlzLl9tYWlu
UGFuZWwuaGFuZGxlVW5kb1JlZG8uYmluZCh0aGlzLl9tYWluUGFuZWwsIHRydWUpOworICAgICAg
ICB0aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleSgi
eiIsIG1vZGlmaWVycy5DdHJsT3JNZXRhKV0gPSBoYW5kbGVVbmRvOworICAgICAgICB0aGlzLl9z
aG9ydGN1dHNbV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleSgieiIsIG1vZGlm
aWVycy5TaGlmdCB8IG1vZGlmaWVycy5DdHJsT3JNZXRhKV0gPSBoYW5kbGVSZWRvOworCisgICAg
ICAgIHZhciBoYW5kbGVUYWJLZXkgPSB0aGlzLl9tYWluUGFuZWwuaGFuZGxlVGFiS2V5UHJlc3Mu
YmluZCh0aGlzLl9tYWluUGFuZWwsIGZhbHNlKTsKKyAgICAgICAgdmFyIGhhbmRsZVNoaWZ0VGFi
S2V5ID0gdGhpcy5fbWFpblBhbmVsLmhhbmRsZVRhYktleVByZXNzLmJpbmQodGhpcy5fbWFpblBh
bmVsLCB0cnVlKTsKKyAgICAgICAgdGhpcy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5LZXlib2Fy
ZFNob3J0Y3V0Lm1ha2VLZXkoa2V5cy5UYWIuY29kZSldID0gaGFuZGxlVGFiS2V5OworICAgICAg
ICB0aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleShr
ZXlzLlRhYi5jb2RlLCBtb2RpZmllcnMuU2hpZnQpXSA9IGhhbmRsZVNoaWZ0VGFiS2V5OworICAg
IH0sCisKKyAgICBfaGFuZGxlS2V5RG93bjogZnVuY3Rpb24oZSkKKyAgICB7CisgICAgICAgIGlm
ICh0aGlzLnJlYWRPbmx5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFyIHNo
b3J0Y3V0S2V5ID0gV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleUZyb21FdmVu
dChlKTsKKyAgICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLl9zaG9ydGN1dHNbc2hvcnRjdXRLZXld
OworICAgICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyKCkpCisgICAgICAgICAgICBlLmNvbnN1
bWUodHJ1ZSk7CisgICAgfSwKKworICAgIF9jb250ZXh0TWVudTogZnVuY3Rpb24oZXZlbnQpCisg
ICAgeworICAgICAgICB2YXIgY29udGV4dE1lbnUgPSBuZXcgV2ViSW5zcGVjdG9yLkNvbnRleHRN
ZW51KCk7CisgICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQuZW5jbG9zaW5nTm9kZU9y
U2VsZldpdGhDbGFzcygid2Via2l0LWxpbmUtbnVtYmVyIik7CisgICAgICAgIGlmICh0YXJnZXQp
CisgICAgICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5wb3B1bGF0ZUxpbmVHdXR0ZXJDb250ZXh0TWVu
dShjb250ZXh0TWVudSwgdGFyZ2V0LmxpbmVOdW1iZXIpOworICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgIHRhcmdldCA9IHRoaXMuX21haW5QYW5lbC5fZW5jbG9zaW5nTGluZVJvd09yU2VsZihl
dmVudC50YXJnZXQpOworICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUucG9wdWxhdGVUZXh0QXJl
YUNvbnRleHRNZW51KGNvbnRleHRNZW51LCB0YXJnZXQgJiYgdGFyZ2V0LmxpbmVOdW1iZXIpOwor
ICAgICAgICB9CisgICAgICAgIGNvbnRleHRNZW51LnNob3coZXZlbnQpOworICAgIH0sCisKKyAg
ICBfY29tbWl0RWRpdGluZzogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMucmVh
ZE9ubHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB0aGlzLl9kZWxl
Z2F0ZS5jb21taXRFZGl0aW5nKCk7CisgICAgICAgIGlmICh0aGlzLl91cmwgJiYgV2ViSW5zcGVj
dG9yLmZpbGVNYW5hZ2VyLmlzVVJMU2F2ZWQodGhpcy5fdXJsKSkKKyAgICAgICAgICAgIFdlYklu
c3BlY3Rvci5maWxlTWFuYWdlci5zYXZlKHRoaXMuX3VybCwgdGhpcy5fdGV4dE1vZGVsLnRleHQo
KSwgZmFsc2UpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAorCisgICAgX2hhbmRsZVNj
cm9sbENoYW5nZWQ6IGZ1bmN0aW9uKGV2ZW50KQorICAgIHsKKyAgICAgICAgdmFyIHZpc2libGVG
cm9tID0gdGhpcy5fbWFpblBhbmVsLmVsZW1lbnQuc2Nyb2xsVG9wOworICAgICAgICB2YXIgZmly
c3RWaXNpYmxlTGluZU51bWJlciA9IHRoaXMuX21haW5QYW5lbC5fZmluZEZpcnN0VmlzaWJsZUxp
bmVOdW1iZXIodmlzaWJsZUZyb20pOworICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5zY3JvbGxDaGFu
Z2VkKGZpcnN0VmlzaWJsZUxpbmVOdW1iZXIpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBA
cGFyYW0ge251bWJlcn0gbGluZU51bWJlcgorICAgICAqLworICAgIHNjcm9sbFRvTGluZTogZnVu
Y3Rpb24obGluZU51bWJlcikKKyAgICB7CisgICAgICAgIHRoaXMuX21haW5QYW5lbC5zY3JvbGxU
b0xpbmUobGluZU51bWJlcik7CisgICAgfSwKKworICAgIF9oYW5kbGVTZWxlY3Rpb25DaGFuZ2U6
IGZ1bmN0aW9uKGV2ZW50KQorICAgIHsKKyAgICAgICAgdmFyIHRleHRSYW5nZSA9IHRoaXMuX21h
aW5QYW5lbC5fZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIGlmICh0ZXh0UmFuZ2UpIHsKKyAgICAg
ICAgICAgIC8vIFdlIGRvIG5vdCByZXN0b3JlIHNlbGVjdGlvbiBhZnRlciBmb2N1cyBsb3N0IHRv
IGF2b2lkIHNlbGVjdGlvbiBibGlua2luZy4gV2UgcmVzdG9yZSBvbmx5IGN1cnNvciBwb3NpdGlv
biBpbnN0ZWFkLgorICAgICAgICAgICAgLy8gRklYTUU6IGNvbnNpZGVyIGFkZGluZyBzZWxlY3Rp
b24gZGVjb3JhdGlvbiB0byBibHVycmVkIGVkaXRvci4KKyAgICAgICAgICAgIHRoaXMuX2xhc3RT
ZWxlY3Rpb24gPSBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbih0ZXh0
UmFuZ2UuZW5kTGluZSwgdGV4dFJhbmdlLmVuZENvbHVtbik7CisgICAgICAgIH0KKyAgICAgICAg
dGhpcy5fZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZCh0ZXh0UmFuZ2UpOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgKiBAcmV0dXJuIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfQorICAgICAqLwor
ICAgIHNlbGVjdGlvbjogZnVuY3Rpb24odGV4dFJhbmdlKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHRoaXMuX21haW5QYW5lbC5fZ2V0U2VsZWN0aW9uKCk7CisgICAgfSwKKworICAgIC8qKgorICAg
ICAqIEByZXR1cm4ge1dlYkluc3BlY3Rvci5UZXh0UmFuZ2U/fQorICAgICAqLworICAgIGxhc3RT
ZWxlY3Rpb246IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9sYXN0U2Vs
ZWN0aW9uOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge1dlYkluc3BlY3Rvci5U
ZXh0UmFuZ2V9IHRleHRSYW5nZQorICAgICAqLworICAgIHNldFNlbGVjdGlvbjogZnVuY3Rpb24o
dGV4dFJhbmdlKQorICAgIHsKKyAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGlvbiA9IHRleHRSYW5n
ZTsKKyAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5pc0FuY2VzdG9yKGRvY3VtZW50LmFjdGl2ZUVs
ZW1lbnQpKQorICAgICAgICAgICAgdGhpcy5fbWFpblBhbmVsLl9yZXN0b3JlU2VsZWN0aW9uKHRl
eHRSYW5nZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0
IAorICAgICAqLworICAgIHNldFRleHQ6IGZ1bmN0aW9uKHRleHQpCisgICAgeworICAgICAgICB0
aGlzLl90ZXh0TW9kZWwuc2V0VGV4dCh0ZXh0KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICog
QHJldHVybiB7c3RyaW5nfQorICAgICAqLworICAgIHRleHQ6IGZ1bmN0aW9uKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLl90ZXh0TW9kZWwudGV4dCgpOworICAgIH0sCisKKyAgICAvKioK
KyAgICAgKiBAcmV0dXJuIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfQorICAgICAqLworICAgIHJh
bmdlOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dE1vZGVsLnJh
bmdlKCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lTnVt
YmVyCisgICAgICogQHJldHVybiB7c3RyaW5nfQorICAgICAqLworICAgIGxpbmU6IGZ1bmN0aW9u
KGxpbmVOdW1iZXIpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dE1vZGVsLmxpbmUo
bGluZU51bWJlcik7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge251bWJlcn0K
KyAgICAgKi8KKyAgICBnZXQgbGluZXNDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5fdGV4dE1vZGVsLmxpbmVzQ291bnQ7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJh
bSB7bnVtYmVyfSBsaW5lCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgIAorICAgICAqIEBw
YXJhbSB7T2JqZWN0P30gdmFsdWUgIAorICAgICAqLworICAgIHNldEF0dHJpYnV0ZTogZnVuY3Rp
b24obGluZSwgbmFtZSwgdmFsdWUpCisgICAgeworICAgICAgICB0aGlzLl90ZXh0TW9kZWwuc2V0
QXR0cmlidXRlKGxpbmUsIG5hbWUsIHZhbHVlKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICog
QHBhcmFtIHtudW1iZXJ9IGxpbmUKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAgCisgICAg
ICogQHJldHVybiB7T2JqZWN0fG51bGx9IHZhbHVlICAKKyAgICAgKi8KKyAgICBnZXRBdHRyaWJ1
dGU6IGZ1bmN0aW9uKGxpbmUsIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4
dE1vZGVsLmdldEF0dHJpYnV0ZShsaW5lLCBuYW1lKTsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICogQHBhcmFtIHtudW1iZXJ9IGxpbmUKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQorICAg
ICAqLworICAgIHJlbW92ZUF0dHJpYnV0ZTogZnVuY3Rpb24obGluZSwgbmFtZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX3RleHRNb2RlbC5yZW1vdmVBdHRyaWJ1dGUobGluZSwgbmFtZSk7CisgICAg
fSwKKworICAgIHdhc1Nob3duOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBpZiAoIXRoaXMu
cmVhZE9ubHkoKSkKKyAgICAgICAgICAgIFdlYkluc3BlY3Rvci5tYXJrQmVpbmdFZGl0ZWQodGhp
cy5lbGVtZW50LCB0cnVlKTsKKworICAgICAgICB0aGlzLl9ib3VuZFNlbGVjdGlvbkNoYW5nZUxp
c3RlbmVyID0gdGhpcy5faGFuZGxlU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyk7CisgICAgICAg
IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsIHRoaXMuX2JvdW5k
U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIsIGZhbHNlKTsKKyAgICB9LAorCisgICAgX2hhbmRsZUZv
Y3VzZWQ6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9sYXN0U2VsZWN0aW9u
KQorICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24odGhpcy5fbGFzdFNlbGVjdGlvbik7Cisg
ICAgfSwKKworICAgIHdpbGxIaWRlOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBkb2N1bWVu
dC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLCB0aGlzLl9ib3VuZFNlbGVj
dGlvbkNoYW5nZUxpc3RlbmVyLCBmYWxzZSk7CisgICAgICAgIGRlbGV0ZSB0aGlzLl9ib3VuZFNl
bGVjdGlvbkNoYW5nZUxpc3RlbmVyOworCisgICAgICAgIGlmICghdGhpcy5yZWFkT25seSgpKQor
ICAgICAgICAgICAgV2ViSW5zcGVjdG9yLm1hcmtCZWluZ0VkaXRlZCh0aGlzLmVsZW1lbnQsIGZh
bHNlKTsKKyAgICB9Cit9CisKK1dlYkluc3BlY3Rvci5EZWZhdWx0VGV4dEVkaXRvci5wcm90b3R5
cGUuX19wcm90b19fID0gV2ViSW5zcGVjdG9yLlZpZXcucHJvdG90eXBlOworCisvKioKKyAqIEBj
b25zdHJ1Y3RvcgorICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsfSB0ZXh0
TW9kZWwKKyAqLworV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2VkUGFuZWwgPSBmdW5jdGlv
bih0ZXh0TW9kZWwpCit7CisgICAgdGhpcy5fdGV4dE1vZGVsID0gdGV4dE1vZGVsOworCisgICAg
dGhpcy5fZGVmYXVsdENodW5rU2l6ZSA9IDUwOworICAgIHRoaXMuX3BhaW50Q29hbGVzY2luZ0xl
dmVsID0gMDsKKyAgICB0aGlzLl9kb21VcGRhdGVDb2FsZXNjaW5nTGV2ZWwgPSAwOworfQorCitX
ZWJJbnNwZWN0b3IuVGV4dEVkaXRvckNodW5rZWRQYW5lbC5wcm90b3R5cGUgPSB7CisgICAgLyoq
CisgICAgICogQHJldHVybiB7V2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbH0KKyAgICAgKi8K
KyAgICBnZXQgdGV4dE1vZGVsKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90ZXh0TW9k
ZWw7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lTnVtYmVy
CisgICAgICovCisgICAgc2Nyb2xsVG9MaW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyKQorICAgIHsK
KyAgICAgICAgaWYgKGxpbmVOdW1iZXIgPj0gdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFyIGNodW5rID0gdGhpcy5tYWtlTGluZUFD
aHVuayhsaW5lTnVtYmVyKTsKKyAgICAgICAgdGhpcy5lbGVtZW50LnNjcm9sbFRvcCA9IGNodW5r
Lm9mZnNldFRvcDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxp
bmVOdW1iZXIKKyAgICAgKi8KKyAgICByZXZlYWxMaW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyKQor
ICAgIHsKKyAgICAgICAgaWYgKGxpbmVOdW1iZXIgPj0gdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291
bnQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFyIGNodW5rID0gdGhpcy5tYWtl
TGluZUFDaHVuayhsaW5lTnVtYmVyKTsKKyAgICAgICAgY2h1bmsuZWxlbWVudC5zY3JvbGxJbnRv
Vmlld0lmTmVlZGVkKCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7bnVtYmVy
fSBsaW5lTnVtYmVyCisgICAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gZGVjb3JhdGlvbgor
ICAgICAqLworICAgIGFkZERlY29yYXRpb246IGZ1bmN0aW9uKGxpbmVOdW1iZXIsIGRlY29yYXRp
b24pCisgICAgeworICAgICAgICBpZiAobGluZU51bWJlciA+PSB0aGlzLl90ZXh0TW9kZWwubGlu
ZXNDb3VudCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2YXIgY2h1bmsgPSB0aGlz
Lm1ha2VMaW5lQUNodW5rKGxpbmVOdW1iZXIpOworICAgICAgICBjaHVuay5hZGREZWNvcmF0aW9u
KGRlY29yYXRpb24pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge251bWJlcn0g
bGluZU51bWJlcgorICAgICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IGRlY29yYXRpb24KKyAg
ICAgKi8KKyAgICByZW1vdmVEZWNvcmF0aW9uOiBmdW5jdGlvbihsaW5lTnVtYmVyLCBkZWNvcmF0
aW9uKQorICAgIHsKKyAgICAgICAgaWYgKGxpbmVOdW1iZXIgPj0gdGhpcy5fdGV4dE1vZGVsLmxp
bmVzQ291bnQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFyIGNodW5rID0gdGhp
cy5jaHVua0ZvckxpbmUobGluZU51bWJlcik7CisgICAgICAgIGNodW5rLnJlbW92ZURlY29yYXRp
b24oZGVjb3JhdGlvbik7CisgICAgfSwKKworICAgIF9idWlsZENodW5rczogZnVuY3Rpb24oKQor
ICAgIHsKKyAgICAgICAgdGhpcy5iZWdpbkRvbVVwZGF0ZXMoKTsKKworICAgICAgICB0aGlzLl9j
b250YWluZXIucmVtb3ZlQ2hpbGRyZW4oKTsKKworICAgICAgICB0aGlzLl90ZXh0Q2h1bmtzID0g
W107CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291
bnQ7IGkgKz0gdGhpcy5fZGVmYXVsdENodW5rU2l6ZSkgeworICAgICAgICAgICAgdmFyIGNodW5r
ID0gdGhpcy5fY3JlYXRlTmV3Q2h1bmsoaSwgaSArIHRoaXMuX2RlZmF1bHRDaHVua1NpemUpOwor
ICAgICAgICAgICAgdGhpcy5fdGV4dENodW5rcy5wdXNoKGNodW5rKTsKKyAgICAgICAgICAgIHRo
aXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChjaHVuay5lbGVtZW50KTsKKyAgICAgICAgfQorCisg
ICAgICAgIHRoaXMuX3JlcGFpbnRBbGwoKTsKKworICAgICAgICB0aGlzLmVuZERvbVVwZGF0ZXMo
KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIK
KyAgICAgKi8KKyAgICBtYWtlTGluZUFDaHVuazogZnVuY3Rpb24obGluZU51bWJlcikKKyAgICB7
CisgICAgICAgIHZhciBjaHVua051bWJlciA9IHRoaXMuX2NodW5rTnVtYmVyRm9yTGluZShsaW5l
TnVtYmVyKTsKKyAgICAgICAgdmFyIG9sZENodW5rID0gdGhpcy5fdGV4dENodW5rc1tjaHVua051
bWJlcl07CisKKyAgICAgICAgaWYgKCFvbGRDaHVuaykgeworICAgICAgICAgICAgY29uc29sZS5l
cnJvcigiTm8gY2h1bmsgZm9yIGxpbmUgbnVtYmVyOiAiICsgbGluZU51bWJlcik7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAob2xkQ2h1bmsubGluZXNDb3Vu
dCA9PT0gMSkKKyAgICAgICAgICAgIHJldHVybiBvbGRDaHVuazsKKworICAgICAgICByZXR1cm4g
dGhpcy5fc3BsaXRDaHVua09uQUxpbmUobGluZU51bWJlciwgY2h1bmtOdW1iZXIsIHRydWUpOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU51bWJlcgorICAg
ICAqIEBwYXJhbSB7bnVtYmVyfSBjaHVua051bWJlcgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19
IGNyZWF0ZVN1ZmZpeENodW5rCisgICAgICovCisgICAgX3NwbGl0Q2h1bmtPbkFMaW5lOiBmdW5j
dGlvbihsaW5lTnVtYmVyLCBjaHVua051bWJlciwgY3JlYXRlU3VmZml4Q2h1bmspCisgICAgewor
ICAgICAgICB0aGlzLmJlZ2luRG9tVXBkYXRlcygpOworCisgICAgICAgIHZhciBvbGRDaHVuayA9
IHRoaXMuX3RleHRDaHVua3NbY2h1bmtOdW1iZXJdOworICAgICAgICB2YXIgd2FzRXhwYW5kZWQg
PSBvbGRDaHVuay5leHBhbmRlZDsKKyAgICAgICAgb2xkQ2h1bmsuZXhwYW5kZWQgPSBmYWxzZTsK
KworICAgICAgICB2YXIgaW5zZXJ0SW5kZXggPSBjaHVua051bWJlciArIDE7CisKKyAgICAgICAg
Ly8gUHJlZml4IGNodW5rLgorICAgICAgICBpZiAobGluZU51bWJlciA+IG9sZENodW5rLnN0YXJ0
TGluZSkgeworICAgICAgICAgICAgdmFyIHByZWZpeENodW5rID0gdGhpcy5fY3JlYXRlTmV3Q2h1
bmsob2xkQ2h1bmsuc3RhcnRMaW5lLCBsaW5lTnVtYmVyKTsKKyAgICAgICAgICAgIHByZWZpeENo
dW5rLnJlYWRPbmx5ID0gb2xkQ2h1bmsucmVhZE9ubHk7CisgICAgICAgICAgICB0aGlzLl90ZXh0
Q2h1bmtzLnNwbGljZShpbnNlcnRJbmRleCsrLCAwLCBwcmVmaXhDaHVuayk7CisgICAgICAgICAg
ICB0aGlzLl9jb250YWluZXIuaW5zZXJ0QmVmb3JlKHByZWZpeENodW5rLmVsZW1lbnQsIG9sZENo
dW5rLmVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTGluZSBjaHVuay4KKyAgICAg
ICAgdmFyIGVuZExpbmUgPSBjcmVhdGVTdWZmaXhDaHVuayA/IGxpbmVOdW1iZXIgKyAxIDogb2xk
Q2h1bmsuc3RhcnRMaW5lICsgb2xkQ2h1bmsubGluZXNDb3VudDsKKyAgICAgICAgdmFyIGxpbmVD
aHVuayA9IHRoaXMuX2NyZWF0ZU5ld0NodW5rKGxpbmVOdW1iZXIsIGVuZExpbmUpOworICAgICAg
ICBsaW5lQ2h1bmsucmVhZE9ubHkgPSBvbGRDaHVuay5yZWFkT25seTsKKyAgICAgICAgdGhpcy5f
dGV4dENodW5rcy5zcGxpY2UoaW5zZXJ0SW5kZXgrKywgMCwgbGluZUNodW5rKTsKKyAgICAgICAg
dGhpcy5fY29udGFpbmVyLmluc2VydEJlZm9yZShsaW5lQ2h1bmsuZWxlbWVudCwgb2xkQ2h1bmsu
ZWxlbWVudCk7CisKKyAgICAgICAgLy8gU3VmZml4IGNodW5rLgorICAgICAgICBpZiAob2xkQ2h1
bmsuc3RhcnRMaW5lICsgb2xkQ2h1bmsubGluZXNDb3VudCA+IGVuZExpbmUpIHsKKyAgICAgICAg
ICAgIHZhciBzdWZmaXhDaHVuayA9IHRoaXMuX2NyZWF0ZU5ld0NodW5rKGVuZExpbmUsIG9sZENo
dW5rLnN0YXJ0TGluZSArIG9sZENodW5rLmxpbmVzQ291bnQpOworICAgICAgICAgICAgc3VmZml4
Q2h1bmsucmVhZE9ubHkgPSBvbGRDaHVuay5yZWFkT25seTsKKyAgICAgICAgICAgIHRoaXMuX3Rl
eHRDaHVua3Muc3BsaWNlKGluc2VydEluZGV4LCAwLCBzdWZmaXhDaHVuayk7CisgICAgICAgICAg
ICB0aGlzLl9jb250YWluZXIuaW5zZXJ0QmVmb3JlKHN1ZmZpeENodW5rLmVsZW1lbnQsIG9sZENo
dW5rLmVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIGVuY2xvc2luZyBj
aHVuay4KKyAgICAgICAgdGhpcy5fdGV4dENodW5rcy5zcGxpY2UoY2h1bmtOdW1iZXIsIDEpOwor
ICAgICAgICB0aGlzLl9jb250YWluZXIucmVtb3ZlQ2hpbGQob2xkQ2h1bmsuZWxlbWVudCk7CisK
KyAgICAgICAgaWYgKHdhc0V4cGFuZGVkKSB7CisgICAgICAgICAgICBpZiAocHJlZml4Q2h1bmsp
CisgICAgICAgICAgICAgICAgcHJlZml4Q2h1bmsuZXhwYW5kZWQgPSB0cnVlOworICAgICAgICAg
ICAgbGluZUNodW5rLmV4cGFuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChzdWZmaXhDaHVu
aykKKyAgICAgICAgICAgICAgICBzdWZmaXhDaHVuay5leHBhbmRlZCA9IHRydWU7CisgICAgICAg
IH0KKworICAgICAgICB0aGlzLmVuZERvbVVwZGF0ZXMoKTsKKworICAgICAgICByZXR1cm4gbGlu
ZUNodW5rOworICAgIH0sCisKKyAgICBfc2Nyb2xsOiBmdW5jdGlvbigpCisgICAgeworICAgICAg
ICB0aGlzLl9zY2hlZHVsZVJlcGFpbnRBbGwoKTsKKyAgICAgICAgaWYgKHRoaXMuX3N5bmNTY3Jv
bGxMaXN0ZW5lcikKKyAgICAgICAgICAgIHRoaXMuX3N5bmNTY3JvbGxMaXN0ZW5lcigpOworICAg
IH0sCisKKyAgICBfc2NoZWR1bGVSZXBhaW50QWxsOiBmdW5jdGlvbigpCisgICAgeworICAgICAg
ICBpZiAodGhpcy5fcmVwYWludEFsbFRpbWVyKQorICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRo
aXMuX3JlcGFpbnRBbGxUaW1lcik7CisgICAgICAgIHRoaXMuX3JlcGFpbnRBbGxUaW1lciA9IHNl
dFRpbWVvdXQodGhpcy5fcmVwYWludEFsbC5iaW5kKHRoaXMpLCA1MCk7CisgICAgfSwKKworICAg
IGJlZ2luVXBkYXRlczogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5fcGFpbnRDb2Fs
ZXNjaW5nTGV2ZWwrKzsKKyAgICB9LAorCisgICAgZW5kVXBkYXRlczogZnVuY3Rpb24oKQorICAg
IHsKKyAgICAgICAgdGhpcy5fcGFpbnRDb2FsZXNjaW5nTGV2ZWwtLTsKKyAgICAgICAgaWYgKCF0
aGlzLl9wYWludENvYWxlc2NpbmdMZXZlbCkKKyAgICAgICAgICAgIHRoaXMuX3JlcGFpbnRBbGwo
KTsKKyAgICB9LAorCisgICAgYmVnaW5Eb21VcGRhdGVzOiBmdW5jdGlvbigpCisgICAgeworICAg
ICAgICB0aGlzLl9kb21VcGRhdGVDb2FsZXNjaW5nTGV2ZWwrKzsKKyAgICB9LAorCisgICAgZW5k
RG9tVXBkYXRlczogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5fZG9tVXBkYXRlQ29h
bGVzY2luZ0xldmVsLS07CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7bnVtYmVy
fSBsaW5lTnVtYmVyCisgICAgICovCisgICAgX2NodW5rTnVtYmVyRm9yTGluZTogZnVuY3Rpb24o
bGluZU51bWJlcikKKyAgICB7CisgICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVMaW5lTnVtYmVycyh2
YWx1ZSwgY2h1bmspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA8IGNodW5r
LnN0YXJ0TGluZSA/IC0xIDogMTsKKyAgICAgICAgfQorICAgICAgICB2YXIgaW5zZXJ0QmVmb3Jl
ID0gaW5zZXJ0aW9uSW5kZXhGb3JPYmplY3RJbkxpc3RTb3J0ZWRCeUZ1bmN0aW9uKGxpbmVOdW1i
ZXIsIHRoaXMuX3RleHRDaHVua3MsIGNvbXBhcmVMaW5lTnVtYmVycyk7CisgICAgICAgIHJldHVy
biBpbnNlcnRCZWZvcmUgLSAxOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge251
bWJlcn0gbGluZU51bWJlcgorICAgICAqLworICAgIGNodW5rRm9yTGluZTogZnVuY3Rpb24obGlu
ZU51bWJlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90ZXh0Q2h1bmtzW3RoaXMuX2No
dW5rTnVtYmVyRm9yTGluZShsaW5lTnVtYmVyKV07CisgICAgfSwKKworICAgIC8qKgorICAgICAq
IEBwYXJhbSB7bnVtYmVyfSB2aXNpYmxlRnJvbQorICAgICAqLworICAgIF9maW5kRmlyc3RWaXNp
YmxlQ2h1bmtOdW1iZXI6IGZ1bmN0aW9uKHZpc2libGVGcm9tKQorICAgIHsKKyAgICAgICAgZnVu
Y3Rpb24gY29tcGFyZU9mZnNldFRvcHModmFsdWUsIGNodW5rKQorICAgICAgICB7CisgICAgICAg
ICAgICByZXR1cm4gdmFsdWUgPCBjaHVuay5vZmZzZXRUb3AgPyAtMSA6IDE7CisgICAgICAgIH0K
KyAgICAgICAgdmFyIGluc2VydEJlZm9yZSA9IGluc2VydGlvbkluZGV4Rm9yT2JqZWN0SW5MaXN0
U29ydGVkQnlGdW5jdGlvbih2aXNpYmxlRnJvbSwgdGhpcy5fdGV4dENodW5rcywgY29tcGFyZU9m
ZnNldFRvcHMpOworICAgICAgICByZXR1cm4gaW5zZXJ0QmVmb3JlIC0gMTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHZpc2libGVGcm9tCisgICAgICogQHBhcmFt
IHtudW1iZXJ9IHZpc2libGVUbworICAgICAqLworICAgIF9maW5kVmlzaWJsZUNodW5rczogZnVu
Y3Rpb24odmlzaWJsZUZyb20sIHZpc2libGVUbykKKyAgICB7CisgICAgICAgIHZhciBmcm9tID0g
dGhpcy5fZmluZEZpcnN0VmlzaWJsZUNodW5rTnVtYmVyKHZpc2libGVGcm9tKTsKKyAgICAgICAg
Zm9yICh2YXIgdG8gPSBmcm9tICsgMTsgdG8gPCB0aGlzLl90ZXh0Q2h1bmtzLmxlbmd0aDsgKyt0
bykgeworICAgICAgICAgICAgaWYgKHRoaXMuX3RleHRDaHVua3NbdG9dLm9mZnNldFRvcCA+PSB2
aXNpYmxlVG8pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIHsgc3RhcnQ6IGZyb20sIGVuZDogdG8gfTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICog
QHBhcmFtIHtudW1iZXJ9IHZpc2libGVGcm9tCisgICAgICovCisgICAgX2ZpbmRGaXJzdFZpc2li
bGVMaW5lTnVtYmVyOiBmdW5jdGlvbih2aXNpYmxlRnJvbSkKKyAgICB7CisgICAgICAgIHZhciBj
aHVuayA9IHRoaXMuX3RleHRDaHVua3NbdGhpcy5fZmluZEZpcnN0VmlzaWJsZUNodW5rTnVtYmVy
KHZpc2libGVGcm9tKV07CisgICAgICAgIGlmICghY2h1bmsuZXhwYW5kZWQpCisgICAgICAgICAg
ICByZXR1cm4gY2h1bmsuc3RhcnRMaW5lOworCisgICAgICAgIHZhciBsaW5lTnVtYmVycyA9IFtd
OworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNodW5rLmxpbmVzQ291bnQ7ICsraSkgewor
ICAgICAgICAgICAgbGluZU51bWJlcnMucHVzaChjaHVuay5zdGFydExpbmUgKyBpKTsKKyAgICAg
ICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVMaW5lUm93T2Zmc2V0VG9wcyh2YWx1ZSwg
bGluZU51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxpbmVSb3cgPSBjaHVuay5n
ZXRFeHBhbmRlZExpbmVSb3cobGluZU51bWJlcik7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUg
PCBsaW5lUm93Lm9mZnNldFRvcCA/IC0xIDogMTsKKyAgICAgICAgfQorICAgICAgICB2YXIgaW5z
ZXJ0QmVmb3JlID0gaW5zZXJ0aW9uSW5kZXhGb3JPYmplY3RJbkxpc3RTb3J0ZWRCeUZ1bmN0aW9u
KHZpc2libGVGcm9tLCBsaW5lTnVtYmVycywgY29tcGFyZUxpbmVSb3dPZmZzZXRUb3BzKTsKKyAg
ICAgICAgcmV0dXJuIGxpbmVOdW1iZXJzW2luc2VydEJlZm9yZSAtIDFdOworICAgIH0sCisKKyAg
ICBfcmVwYWludEFsbDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgZGVsZXRlIHRoaXMuX3Jl
cGFpbnRBbGxUaW1lcjsKKworICAgICAgICBpZiAodGhpcy5fcGFpbnRDb2FsZXNjaW5nTGV2ZWwg
fHwgdGhpcy5fZGlydHlMaW5lcykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2YXIg
dmlzaWJsZUZyb20gPSB0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wOworICAgICAgICB2YXIgdmlzaWJs
ZVRvID0gdGhpcy5lbGVtZW50LnNjcm9sbFRvcCArIHRoaXMuZWxlbWVudC5jbGllbnRIZWlnaHQ7
CisKKyAgICAgICAgaWYgKHZpc2libGVUbykgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRo
aXMuX2ZpbmRWaXNpYmxlQ2h1bmtzKHZpc2libGVGcm9tLCB2aXNpYmxlVG8pOworICAgICAgICAg
ICAgdGhpcy5fZXhwYW5kQ2h1bmtzKHJlc3VsdC5zdGFydCwgcmVzdWx0LmVuZCk7CisgICAgICAg
IH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleAor
ICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b0luZGV4CisgICAgICovCisgICAgX2V4cGFuZENodW5r
czogZnVuY3Rpb24oZnJvbUluZGV4LCB0b0luZGV4KQorICAgIHsKKyAgICAgICAgLy8gRmlyc3Qg
Y29sbGFwc2UgY2h1bmtzIHRvIGNvbGxlY3QgdGhlIERPTSBlbGVtZW50cyBpbnRvIGEgY2FjaGUg
dG8gcmV1c2UgdGhlbSBsYXRlci4KKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcm9tSW5k
ZXg7ICsraSkKKyAgICAgICAgICAgIHRoaXMuX3RleHRDaHVua3NbaV0uZXhwYW5kZWQgPSBmYWxz
ZTsKKyAgICAgICAgZm9yICh2YXIgaSA9IHRvSW5kZXg7IGkgPCB0aGlzLl90ZXh0Q2h1bmtzLmxl
bmd0aDsgKytpKQorICAgICAgICAgICAgdGhpcy5fdGV4dENodW5rc1tpXS5leHBhbmRlZCA9IGZh
bHNlOworICAgICAgICBmb3IgKHZhciBpID0gZnJvbUluZGV4OyBpIDwgdG9JbmRleDsgKytpKQor
ICAgICAgICAgICAgdGhpcy5fdGV4dENodW5rc1tpXS5leHBhbmRlZCA9IHRydWU7CisgICAgfSwK
KworICAgIC8qKgorICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZmlyc3RFbGVtZW50CisgICAgICog
QHBhcmFtIHtFbGVtZW50PX0gbGFzdEVsZW1lbnQKKyAgICAgKi8KKyAgICBfdG90YWxIZWlnaHQ6
IGZ1bmN0aW9uKGZpcnN0RWxlbWVudCwgbGFzdEVsZW1lbnQpCisgICAgeworICAgICAgICBsYXN0
RWxlbWVudCA9IChsYXN0RWxlbWVudCB8fCBmaXJzdEVsZW1lbnQpLm5leHRFbGVtZW50U2libGlu
ZzsKKyAgICAgICAgaWYgKGxhc3RFbGVtZW50KQorICAgICAgICAgICAgcmV0dXJuIGxhc3RFbGVt
ZW50Lm9mZnNldFRvcCAtIGZpcnN0RWxlbWVudC5vZmZzZXRUb3A7CisKKyAgICAgICAgdmFyIG9m
ZnNldFBhcmVudCA9IGZpcnN0RWxlbWVudC5vZmZzZXRQYXJlbnQ7CisgICAgICAgIGlmIChvZmZz
ZXRQYXJlbnQgJiYgb2Zmc2V0UGFyZW50LnNjcm9sbEhlaWdodCA+IG9mZnNldFBhcmVudC5jbGll
bnRIZWlnaHQpCisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0UGFyZW50LnNjcm9sbEhlaWdodCAt
IGZpcnN0RWxlbWVudC5vZmZzZXRUb3A7CisKKyAgICAgICAgdmFyIHRvdGFsID0gMDsKKyAgICAg
ICAgd2hpbGUgKGZpcnN0RWxlbWVudCAmJiBmaXJzdEVsZW1lbnQgIT09IGxhc3RFbGVtZW50KSB7
CisgICAgICAgICAgICB0b3RhbCArPSBmaXJzdEVsZW1lbnQub2Zmc2V0SGVpZ2h0OworICAgICAg
ICAgICAgZmlyc3RFbGVtZW50ID0gZmlyc3RFbGVtZW50Lm5leHRFbGVtZW50U2libGluZzsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWw7CisgICAgfSwKKworICAgIHJlc2l6ZTogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5fcmVwYWludEFsbCgpOworICAgIH0KK30KKwor
LyoqCisgKiBAY29uc3RydWN0b3IKKyAqIEBleHRlbmRzIHtXZWJJbnNwZWN0b3IuVGV4dEVkaXRv
ckNodW5rZWRQYW5lbH0KKyAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbH0g
dGV4dE1vZGVsCisgKi8KK1dlYkluc3BlY3Rvci5UZXh0RWRpdG9yR3V0dGVyUGFuZWwgPSBmdW5j
dGlvbih0ZXh0TW9kZWwsIHN5bmNEZWNvcmF0aW9uc0ZvckxpbmVMaXN0ZW5lciwgc3luY0xpbmVI
ZWlnaHRMaXN0ZW5lcikKK3sKKyAgICBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckNodW5rZWRQYW5l
bC5jYWxsKHRoaXMsIHRleHRNb2RlbCk7CisKKyAgICB0aGlzLl9zeW5jRGVjb3JhdGlvbnNGb3JM
aW5lTGlzdGVuZXIgPSBzeW5jRGVjb3JhdGlvbnNGb3JMaW5lTGlzdGVuZXI7CisgICAgdGhpcy5f
c3luY0xpbmVIZWlnaHRMaXN0ZW5lciA9IHN5bmNMaW5lSGVpZ2h0TGlzdGVuZXI7CisKKyAgICB0
aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICB0aGlzLmVs
ZW1lbnQuY2xhc3NOYW1lID0gInRleHQtZWRpdG9yLWxpbmVzIjsKKworICAgIHRoaXMuX2NvbnRh
aW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHRoaXMuX2NvbnRhaW5l
ci5jbGFzc05hbWUgPSAiaW5uZXItY29udGFpbmVyIjsKKyAgICB0aGlzLmVsZW1lbnQuYXBwZW5k
Q2hpbGQodGhpcy5fY29udGFpbmVyKTsKKworICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3Rl
bmVyKCJzY3JvbGwiLCB0aGlzLl9zY3JvbGwuYmluZCh0aGlzKSwgZmFsc2UpOworCisgICAgdGhp
cy5mcmVlQ2FjaGVkRWxlbWVudHMoKTsKKyAgICB0aGlzLl9idWlsZENodW5rcygpOworICAgIHRo
aXMuX2RlY29yYXRpb25zID0ge307Cit9CisKK1dlYkluc3BlY3Rvci5UZXh0RWRpdG9yR3V0dGVy
UGFuZWwucHJvdG90eXBlID0geworICAgIGZyZWVDYWNoZWRFbGVtZW50czogZnVuY3Rpb24oKQor
ICAgIHsKKyAgICAgICAgdGhpcy5fY2FjaGVkUm93cyA9IFtdOworICAgIH0sCisKKyAgICAvKioK
KyAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRMaW5lCisgICAgICogQHBhcmFtIHtudW1iZXJ9
IGVuZExpbmUKKyAgICAgKi8KKyAgICBfY3JlYXRlTmV3Q2h1bms6IGZ1bmN0aW9uKHN0YXJ0TGlu
ZSwgZW5kTGluZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRF
ZGl0b3JHdXR0ZXJDaHVuayh0aGlzLCBzdGFydExpbmUsIGVuZExpbmUpOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgKiBAcGFyYW0ge1dlYkluc3BlY3Rvci5UZXh0UmFuZ2V9IG9sZFJhbmdlCisg
ICAgICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSBuZXdSYW5nZQorICAgICAqLwor
ICAgIHRleHRDaGFuZ2VkOiBmdW5jdGlvbihvbGRSYW5nZSwgbmV3UmFuZ2UpCisgICAgeworICAg
ICAgICB0aGlzLmJlZ2luRG9tVXBkYXRlcygpOworCisgICAgICAgIHZhciBsaW5lc0RpZmYgPSBu
ZXdSYW5nZS5saW5lc0NvdW50IC0gb2xkUmFuZ2UubGluZXNDb3VudDsKKyAgICAgICAgaWYgKGxp
bmVzRGlmZikgeworICAgICAgICAgICAgLy8gUmVtb3ZlIG9sZCBjaHVua3MgKGlmIG5lZWRlZCku
CisgICAgICAgICAgICBmb3IgKHZhciBjaHVua051bWJlciA9IHRoaXMuX3RleHRDaHVua3MubGVu
Z3RoIC0gMTsgY2h1bmtOdW1iZXIgPj0gMCA7IC0tY2h1bmtOdW1iZXIpIHsKKyAgICAgICAgICAg
ICAgICB2YXIgY2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtzW2NodW5rTnVtYmVyXTsKKyAgICAgICAg
ICAgICAgICBpZiAoY2h1bmsuc3RhcnRMaW5lICsgY2h1bmsubGluZXNDb3VudCA8PSB0aGlzLl90
ZXh0TW9kZWwubGluZXNDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgY2h1bmsuZXhwYW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB0aGlzLl9j
b250YWluZXIucmVtb3ZlQ2hpbGQoY2h1bmsuZWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICB0aGlzLl90ZXh0Q2h1bmtzLmxlbmd0aCA9IGNodW5rTnVtYmVyICsgMTsKKworICAg
ICAgICAgICAgLy8gQWRkIG5ldyBjaHVua3MgKGlmIG5lZWRlZCkuCisgICAgICAgICAgICB2YXIg
dG90YWxMaW5lcyA9IDA7CisgICAgICAgICAgICBpZiAodGhpcy5fdGV4dENodW5rcy5sZW5ndGgp
IHsKKyAgICAgICAgICAgICAgICB2YXIgbGFzdENodW5rID0gdGhpcy5fdGV4dENodW5rc1t0aGlz
Ll90ZXh0Q2h1bmtzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgICAgIHRvdGFsTGluZXMgPSBs
YXN0Q2h1bmsuc3RhcnRMaW5lICsgbGFzdENodW5rLmxpbmVzQ291bnQ7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSB0b3RhbExpbmVzOyBpIDwgdGhpcy5fdGV4dE1v
ZGVsLmxpbmVzQ291bnQ7IGkgKz0gdGhpcy5fZGVmYXVsdENodW5rU2l6ZSkgeworICAgICAgICAg
ICAgICAgIHZhciBjaHVuayA9IHRoaXMuX2NyZWF0ZU5ld0NodW5rKGksIGkgKyB0aGlzLl9kZWZh
dWx0Q2h1bmtTaXplKTsKKyAgICAgICAgICAgICAgICB0aGlzLl90ZXh0Q2h1bmtzLnB1c2goY2h1
bmspOworICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChjaHVuay5l
bGVtZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2hpZnQgZGVjb3JhdGlv
bnMgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBmb3IgKHZhciBsaW5lTnVtYmVyIGluIHRoaXMu
X2RlY29yYXRpb25zKSB7CisgICAgICAgICAgICAgICAgbGluZU51bWJlciA9IHBhcnNlSW50KGxp
bmVOdW1iZXIsIDEwKTsKKworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBtb3ZlIGRlY29yYXRp
b25zIGJlZm9yZSB0aGUgc3RhcnQgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgaWYgKGxpbmVO
dW1iZXIgPCBvbGRSYW5nZS5zdGFydExpbmUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgICAgIC8vIERlY29yYXRpb25zIGZvbGxvdyB0aGUgZmlyc3QgY2hhcmFj
dGVyIG9mIGxpbmUuCisgICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1iZXIgPT09IG9sZFJhbmdl
LnN0YXJ0TGluZSAmJiBvbGRSYW5nZS5zdGFydENvbHVtbikKKyAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgICAgICAgICB2YXIgbGluZURlY29yYXRpb25zQ29weSA9IHRo
aXMuX2RlY29yYXRpb25zW2xpbmVOdW1iZXJdLnNsaWNlKCk7CisgICAgICAgICAgICAgICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCBsaW5lRGVjb3JhdGlvbnNDb3B5Lmxlbmd0aDsgKytpKSB7CisgICAg
ICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0aW9uID0gbGluZURlY29yYXRpb25zQ29weVtpXTsK
KyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEZWNvcmF0aW9uKGxpbmVOdW1iZXIsIGRl
Y29yYXRpb24pOworCisgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCByZXN0b3JlIHRoZSBk
ZWNvcmF0aW9ucyBiZWZvcmUgdGhlIGVuZCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICAgICAg
aWYgKGxpbmVOdW1iZXIgPCBvbGRSYW5nZS5lbmRMaW5lKQorICAgICAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGREZWNvcmF0aW9uKGxp
bmVOdW1iZXIgKyBsaW5lc0RpZmYsIGRlY29yYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5fcmVwYWludEFsbCgpOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgLy8gRGVjb3JhdGlvbnMgbWF5IGhhdmUgYmVlbiByZW1vdmVk
LCBzbyB3ZSBtYXkgaGF2ZSB0byBzeW5jIHRob3NlIGxpbmVzLgorICAgICAgICAgICAgdmFyIGNo
dW5rTnVtYmVyID0gdGhpcy5fY2h1bmtOdW1iZXJGb3JMaW5lKG5ld1JhbmdlLnN0YXJ0TGluZSk7
CisgICAgICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtzW2NodW5rTnVtYmVyXTsK
KyAgICAgICAgICAgIHdoaWxlIChjaHVuayAmJiBjaHVuay5zdGFydExpbmUgPD0gbmV3UmFuZ2Uu
ZW5kTGluZSkgeworICAgICAgICAgICAgICAgIGlmIChjaHVuay5saW5lc0NvdW50ID09PSAxKQor
ICAgICAgICAgICAgICAgICAgICB0aGlzLl9zeW5jRGVjb3JhdGlvbnNGb3JMaW5lTGlzdGVuZXIo
Y2h1bmsuc3RhcnRMaW5lKTsKKyAgICAgICAgICAgICAgICBjaHVuayA9IHRoaXMuX3RleHRDaHVu
a3NbKytjaHVua051bWJlcl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0
aGlzLmVuZERvbVVwZGF0ZXMoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtu
dW1iZXJ9IGNsaWVudEhlaWdodAorICAgICAqLworICAgIHN5bmNDbGllbnRIZWlnaHQ6IGZ1bmN0
aW9uKGNsaWVudEhlaWdodCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLmVsZW1lbnQub2Zmc2V0
SGVpZ2h0ID4gY2xpZW50SGVpZ2h0KQorICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxl
LnNldFByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIsICh0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0
IC0gY2xpZW50SGVpZ2h0KSArICJweCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlz
Ll9jb250YWluZXIuc3R5bGUucmVtb3ZlUHJvcGVydHkoInBhZGRpbmctYm90dG9tIik7CisgICAg
fSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lTnVtYmVyCisgICAgICog
QHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gZGVjb3JhdGlvbgorICAgICAqLworICAgIGFkZERlY29y
YXRpb246IGZ1bmN0aW9uKGxpbmVOdW1iZXIsIGRlY29yYXRpb24pCisgICAgeworICAgICAgICBX
ZWJJbnNwZWN0b3IuVGV4dEVkaXRvckNodW5rZWRQYW5lbC5wcm90b3R5cGUuYWRkRGVjb3JhdGlv
bi5jYWxsKHRoaXMsIGxpbmVOdW1iZXIsIGRlY29yYXRpb24pOworICAgICAgICB2YXIgZGVjb3Jh
dGlvbnMgPSB0aGlzLl9kZWNvcmF0aW9uc1tsaW5lTnVtYmVyXTsKKyAgICAgICAgaWYgKCFkZWNv
cmF0aW9ucykgeworICAgICAgICAgICAgZGVjb3JhdGlvbnMgPSBbXTsKKyAgICAgICAgICAgIHRo
aXMuX2RlY29yYXRpb25zW2xpbmVOdW1iZXJdID0gZGVjb3JhdGlvbnM7CisgICAgICAgIH0KKyAg
ICAgICAgZGVjb3JhdGlvbnMucHVzaChkZWNvcmF0aW9uKTsKKyAgICB9LAorCisgICAgLyoqCisg
ICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIKKyAgICAgKiBAcGFyYW0ge3N0cmluZ3xF
bGVtZW50fSBkZWNvcmF0aW9uCisgICAgICovCisgICAgcmVtb3ZlRGVjb3JhdGlvbjogZnVuY3Rp
b24obGluZU51bWJlciwgZGVjb3JhdGlvbikKKyAgICB7CisgICAgICAgIFdlYkluc3BlY3Rvci5U
ZXh0RWRpdG9yQ2h1bmtlZFBhbmVsLnByb3RvdHlwZS5yZW1vdmVEZWNvcmF0aW9uLmNhbGwodGhp
cywgbGluZU51bWJlciwgZGVjb3JhdGlvbik7CisgICAgICAgIHZhciBkZWNvcmF0aW9ucyA9IHRo
aXMuX2RlY29yYXRpb25zW2xpbmVOdW1iZXJdOworICAgICAgICBpZiAoZGVjb3JhdGlvbnMpIHsK
KyAgICAgICAgICAgIGRlY29yYXRpb25zLnJlbW92ZShkZWNvcmF0aW9uKTsKKyAgICAgICAgICAg
IGlmICghZGVjb3JhdGlvbnMubGVuZ3RoKQorICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9k
ZWNvcmF0aW9uc1tsaW5lTnVtYmVyXTsKKyAgICAgICAgfQorICAgIH0KK30KKworV2ViSW5zcGVj
dG9yLlRleHRFZGl0b3JHdXR0ZXJQYW5lbC5wcm90b3R5cGUuX19wcm90b19fID0gV2ViSW5zcGVj
dG9yLlRleHRFZGl0b3JDaHVua2VkUGFuZWwucHJvdG90eXBlOworCisvKioKKyAqIEBjb25zdHJ1
Y3RvcgorICovCitXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckd1dHRlckNodW5rID0gZnVuY3Rpb24o
dGV4dEVkaXRvciwgc3RhcnRMaW5lLCBlbmRMaW5lKQoreworICAgIHRoaXMuX3RleHRFZGl0b3Ig
PSB0ZXh0RWRpdG9yOworICAgIHRoaXMuX3RleHRNb2RlbCA9IHRleHRFZGl0b3IuX3RleHRNb2Rl
bDsKKworICAgIHRoaXMuc3RhcnRMaW5lID0gc3RhcnRMaW5lOworICAgIGVuZExpbmUgPSBNYXRo
Lm1pbih0aGlzLl90ZXh0TW9kZWwubGluZXNDb3VudCwgZW5kTGluZSk7CisgICAgdGhpcy5saW5l
c0NvdW50ID0gZW5kTGluZSAtIHN0YXJ0TGluZTsKKworICAgIHRoaXMuX2V4cGFuZGVkID0gZmFs
c2U7CisKKyAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsK
KyAgICB0aGlzLmVsZW1lbnQubGluZU51bWJlciA9IHN0YXJ0TGluZTsKKyAgICB0aGlzLmVsZW1l
bnQuY2xhc3NOYW1lID0gIndlYmtpdC1saW5lLW51bWJlciI7CisKKyAgICBpZiAodGhpcy5saW5l
c0NvdW50ID09PSAxKSB7CisgICAgICAgIC8vIFNpbmdsZSBsaW5lIGNodW5rcyBhcmUgdHlwaWNh
bGx5IGNyZWF0ZWQgZm9yIGRlY29yYXRpb25zLiBIb3N0IGxpbmUgbnVtYmVyIGluCisgICAgICAg
IC8vIHRoZSBzdWItZWxlbWVudCBpbiBvcmRlciB0byBhbGxvdyBmbGV4aWJsZSBib3JkZXIgLyBt
YXJnaW4gbWFuYWdlbWVudC4KKyAgICAgICAgdmFyIGlubmVyU3BhbiA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoInNwYW4iKTsKKyAgICAgICAgaW5uZXJTcGFuLmNsYXNzTmFtZSA9ICJ3ZWJraXQt
bGluZS1udW1iZXItaW5uZXIiOworICAgICAgICBpbm5lclNwYW4udGV4dENvbnRlbnQgPSBzdGFy
dExpbmUgKyAxOworICAgICAgICB2YXIgb3V0ZXJTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCgiZGl2Iik7CisgICAgICAgIG91dGVyU3Bhbi5jbGFzc05hbWUgPSAid2Via2l0LWxpbmUtbnVt
YmVyLW91dGVyIjsKKyAgICAgICAgb3V0ZXJTcGFuLmFwcGVuZENoaWxkKGlubmVyU3Bhbik7Cisg
ICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChvdXRlclNwYW4pOworICAgIH0gZWxzZSB7
CisgICAgICAgIHZhciBsaW5lTnVtYmVycyA9IFtdOworICAgICAgICBmb3IgKHZhciBpID0gc3Rh
cnRMaW5lOyBpIDwgZW5kTGluZTsgKytpKQorICAgICAgICAgICAgbGluZU51bWJlcnMucHVzaChp
ICsgMSk7CisgICAgICAgIHRoaXMuZWxlbWVudC50ZXh0Q29udGVudCA9IGxpbmVOdW1iZXJzLmpv
aW4oIlxuIik7CisgICAgfQorfQorCitXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckd1dHRlckNodW5r
LnByb3RvdHlwZSA9IHsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjb3JhdGlv
bgorICAgICAqLworICAgIGFkZERlY29yYXRpb246IGZ1bmN0aW9uKGRlY29yYXRpb24pCisgICAg
eworICAgICAgICB0aGlzLl90ZXh0RWRpdG9yLmJlZ2luRG9tVXBkYXRlcygpOworICAgICAgICBp
ZiAodHlwZW9mIGRlY29yYXRpb24gPT09ICJzdHJpbmciKQorICAgICAgICAgICAgdGhpcy5lbGVt
ZW50LmFkZFN0eWxlQ2xhc3MoZGVjb3JhdGlvbik7CisgICAgICAgIHRoaXMuX3RleHRFZGl0b3Iu
ZW5kRG9tVXBkYXRlcygpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge3N0cmlu
Z30gZGVjb3JhdGlvbgorICAgICAqLworICAgIHJlbW92ZURlY29yYXRpb246IGZ1bmN0aW9uKGRl
Y29yYXRpb24pCisgICAgeworICAgICAgICB0aGlzLl90ZXh0RWRpdG9yLmJlZ2luRG9tVXBkYXRl
cygpOworICAgICAgICBpZiAodHlwZW9mIGRlY29yYXRpb24gPT09ICJzdHJpbmciKQorICAgICAg
ICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZVN0eWxlQ2xhc3MoZGVjb3JhdGlvbik7CisgICAgICAg
IHRoaXMuX3RleHRFZGl0b3IuZW5kRG9tVXBkYXRlcygpOworICAgIH0sCisKKyAgICAvKioKKyAg
ICAgKiBAcmV0dXJuIHtib29sZWFufQorICAgICAqLworICAgIGdldCBleHBhbmRlZCgpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kZWQ7CisgICAgfSwKKworICAgIHNldCBleHBh
bmRlZChleHBhbmRlZCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLmxpbmVzQ291bnQgPT09IDEp
CisgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdG9yLl9zeW5jRGVjb3JhdGlvbnNGb3JMaW5lTGlz
dGVuZXIodGhpcy5zdGFydExpbmUpOworCisgICAgICAgIGlmICh0aGlzLl9leHBhbmRlZCA9PT0g
ZXhwYW5kZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdGhpcy5fZXhwYW5kZWQg
PSBleHBhbmRlZDsKKworICAgICAgICBpZiAodGhpcy5saW5lc0NvdW50ID09PSAxKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIHRoaXMuX3RleHRFZGl0b3IuYmVnaW5Eb21VcGRhdGVz
KCk7CisKKyAgICAgICAgaWYgKGV4cGFuZGVkKSB7CisgICAgICAgICAgICB0aGlzLl9leHBhbmRl
ZExpbmVSb3dzID0gW107CisgICAgICAgICAgICB2YXIgcGFyZW50RWxlbWVudCA9IHRoaXMuZWxl
bWVudC5wYXJlbnRFbGVtZW50OworICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuc3RhcnRM
aW5lOyBpIDwgdGhpcy5zdGFydExpbmUgKyB0aGlzLmxpbmVzQ291bnQ7ICsraSkgeworICAgICAg
ICAgICAgICAgIHZhciBsaW5lUm93ID0gdGhpcy5fY3JlYXRlUm93KGkpOworICAgICAgICAgICAg
ICAgIHBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGxpbmVSb3csIHRoaXMuZWxlbWVudCk7Cisg
ICAgICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWRMaW5lUm93cy5wdXNoKGxpbmVSb3cpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgcGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmVs
ZW1lbnQpOworICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRvci5fc3luY0xpbmVIZWlnaHRMaXN0
ZW5lcih0aGlzLl9leHBhbmRlZExpbmVSb3dzWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIHZhciBlbGVtZW50SW5zZXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgdGhpcy5fZXhwYW5kZWRMaW5lUm93cy5sZW5ndGg7ICsraSkgeworICAgICAg
ICAgICAgICAgIHZhciBsaW5lUm93ID0gdGhpcy5fZXhwYW5kZWRMaW5lUm93c1tpXTsKKyAgICAg
ICAgICAgICAgICB2YXIgcGFyZW50RWxlbWVudCA9IGxpbmVSb3cucGFyZW50RWxlbWVudDsKKyAg
ICAgICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICBp
ZiAoIWVsZW1lbnRJbnNlcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElu
c2VydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuaW5z
ZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgbGluZVJvdyk7CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChsaW5lUm93KTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRvci5fY2Fj
aGVkUm93cy5wdXNoKGxpbmVSb3cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRl
IHRoaXMuX2V4cGFuZGVkTGluZVJvd3M7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl90ZXh0
RWRpdG9yLmVuZERvbVVwZGF0ZXMoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHJldHVy
biB7bnVtYmVyfQorICAgICAqLworICAgIGdldCBoZWlnaHQoKQorICAgIHsKKyAgICAgICAgaWYg
KCF0aGlzLl9leHBhbmRlZExpbmVSb3dzKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RleHRF
ZGl0b3IuX3RvdGFsSGVpZ2h0KHRoaXMuZWxlbWVudCk7CisgICAgICAgIHJldHVybiB0aGlzLl90
ZXh0RWRpdG9yLl90b3RhbEhlaWdodCh0aGlzLl9leHBhbmRlZExpbmVSb3dzWzBdLCB0aGlzLl9l
eHBhbmRlZExpbmVSb3dzW3RoaXMuX2V4cGFuZGVkTGluZVJvd3MubGVuZ3RoIC0gMV0pOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtudW1iZXJ9CisgICAgICovCisgICAgZ2V0
IG9mZnNldFRvcCgpCisgICAgeworICAgICAgICByZXR1cm4gKHRoaXMuX2V4cGFuZGVkTGluZVJv
d3MgJiYgdGhpcy5fZXhwYW5kZWRMaW5lUm93cy5sZW5ndGgpID8gdGhpcy5fZXhwYW5kZWRMaW5l
Um93c1swXS5vZmZzZXRUb3AgOiB0aGlzLmVsZW1lbnQub2Zmc2V0VG9wOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU51bWJlcgorICAgICAqIEByZXR1cm4g
e0VsZW1lbnR9CisgICAgICovCisgICAgX2NyZWF0ZVJvdzogZnVuY3Rpb24obGluZU51bWJlcikK
KyAgICB7CisgICAgICAgIHZhciBsaW5lUm93ID0gdGhpcy5fdGV4dEVkaXRvci5fY2FjaGVkUm93
cy5wb3AoKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICAgICAgbGluZVJv
dy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKKyAgICAgICAgbGluZVJvdy5jbGFzc05hbWUgPSAi
d2Via2l0LWxpbmUtbnVtYmVyIjsKKyAgICAgICAgbGluZVJvdy50ZXh0Q29udGVudCA9IGxpbmVO
dW1iZXIgKyAxOworICAgICAgICByZXR1cm4gbGluZVJvdzsKKyAgICB9Cit9CisKKy8qKgorICog
QGNvbnN0cnVjdG9yCisgKiBAZXh0ZW5kcyB7V2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2Vk
UGFuZWx9CisgKiBAcGFyYW0ge1dlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWx9IHRleHRNb2Rl
bAorICogQHBhcmFtIHs/c3RyaW5nfSB1cmwKKyAqLworV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JN
YWluUGFuZWwgPSBmdW5jdGlvbih0ZXh0TW9kZWwsIHVybCwgc3luY1Njcm9sbExpc3RlbmVyLCBz
eW5jRGVjb3JhdGlvbnNGb3JMaW5lTGlzdGVuZXIsIGVudGVyVGV4dENoYW5nZU1vZGUsIGV4aXRU
ZXh0Q2hhbmdlTW9kZSkKK3sKKyAgICBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckNodW5rZWRQYW5l
bC5jYWxsKHRoaXMsIHRleHRNb2RlbCk7CisKKyAgICB0aGlzLl9zeW5jU2Nyb2xsTGlzdGVuZXIg
PSBzeW5jU2Nyb2xsTGlzdGVuZXI7CisgICAgdGhpcy5fc3luY0RlY29yYXRpb25zRm9yTGluZUxp
c3RlbmVyID0gc3luY0RlY29yYXRpb25zRm9yTGluZUxpc3RlbmVyOworICAgIHRoaXMuX2VudGVy
VGV4dENoYW5nZU1vZGUgPSBlbnRlclRleHRDaGFuZ2VNb2RlOworICAgIHRoaXMuX2V4aXRUZXh0
Q2hhbmdlTW9kZSA9IGV4aXRUZXh0Q2hhbmdlTW9kZTsKKworICAgIHRoaXMuX3VybCA9IHVybDsK
KyAgICB0aGlzLl9oaWdobGlnaHRlciA9IG5ldyBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckhpZ2hs
aWdodGVyKHRleHRNb2RlbCwgdGhpcy5faGlnaGxpZ2h0RGF0YVJlYWR5LmJpbmQodGhpcykpOwor
ICAgIHRoaXMuX3JlYWRPbmx5ID0gdHJ1ZTsKKworICAgIHRoaXMuZWxlbWVudCA9IGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAidGV4
dC1lZGl0b3ItY29udGVudHMiOworICAgIHRoaXMuZWxlbWVudC50YWJJbmRleCA9IDA7CisKKyAg
ICB0aGlzLl9jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICB0
aGlzLl9jb250YWluZXIuY2xhc3NOYW1lID0gImlubmVyLWNvbnRhaW5lciI7CisgICAgdGhpcy5f
Y29udGFpbmVyLnRhYkluZGV4ID0gMDsKKyAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhp
cy5fY29udGFpbmVyKTsKKworICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJzY3Jv
bGwiLCB0aGlzLl9zY3JvbGwuYmluZCh0aGlzKSwgZmFsc2UpOworICAgIHRoaXMuZWxlbWVudC5h
ZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsIHRoaXMuX2hhbmRsZUVsZW1lbnRGb2N1cy5iaW5kKHRo
aXMpLCBmYWxzZSk7CisKKyAgICAvLyBJbiBXZWJLaXQgdGhlIERPTU5vZGVSZW1vdmVkIGV2ZW50
IGlzIGZpcmVkIEFGVEVSIHRoZSBub2RlIGlzIHJlbW92ZWQsIHRodXMgaXQgc2hvdWxkIGJlCisg
ICAgLy8gYXR0YWNoZWQgdG8gYWxsIERPTSBub2RlcyB0aGF0IHdlIHdhbnQgdG8gdHJhY2suIElu
c3RlYWQsIHdlIGF0dGFjaCB0aGUgRE9NTm9kZVJlbW92ZWQKKyAgICAvLyBsaXN0ZW5lcnMgb25s
eSBvbiB0aGUgbGluZSByb3dzLCBhbmQgdXNlIERPTVN1YnRyZWVNb2RpZmllZCB0byB0cmFjayBu
b2RlIHJlbW92YWxzIGluc2lkZQorICAgIC8vIHRoZSBsaW5lIHJvd3MuIEZvciBtb3JlIGluZm8g
c2VlOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTU2NjYKKyAgICAv
LworICAgIC8vIE9QVElNSVpBVElPTi4gSXQgaXMgdmVyeSBleHBlbnNpdmUgdG8gbGlzdGVuIHRv
IHRoZSBET00gbXV0YXRpb24gZXZlbnRzLCB0aHVzIHdlIHJlbW92ZSB0aGUKKyAgICAvLyBsaXN0
ZW5lcnMgd2hlbmV2ZXIgd2UgZG8gYW55IGludGVybmFsIERPTSBtYW5pcHVsYXRpb25zIChzdWNo
IGFzIGV4cGFuZC9jb2xsYXBzZSBsaW5lIHJvd3MpCisgICAgLy8gYW5kIHNldCB0aGUgbGlzdGVu
ZXJzIGJhY2sgd2hlbiB3ZSBhcmUgZmluaXNoZWQuCisgICAgdGhpcy5faGFuZGxlRE9NVXBkYXRl
c0NhbGxiYWNrID0gdGhpcy5faGFuZGxlRE9NVXBkYXRlcy5iaW5kKHRoaXMpOworICAgIHRoaXMu
X2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQiLCB0
aGlzLl9oYW5kbGVET01VcGRhdGVzQ2FsbGJhY2ssIGZhbHNlKTsKKyAgICB0aGlzLl9jb250YWlu
ZXIuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTm9kZUluc2VydGVkIiwgdGhpcy5faGFuZGxlRE9NVXBk
YXRlc0NhbGxiYWNrLCBmYWxzZSk7CisgICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVu
ZXIoIkRPTVN1YnRyZWVNb2RpZmllZCIsIHRoaXMuX2hhbmRsZURPTVVwZGF0ZXNDYWxsYmFjaywg
ZmFsc2UpOworCisgICAgdGhpcy5mcmVlQ2FjaGVkRWxlbWVudHMoKTsKKyAgICB0aGlzLl9idWls
ZENodW5rcygpOworfQorCitXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5QYW5lbC5wcm90b3R5
cGUgPSB7CisgICAgLyoqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG1pbWVUeXBlCisgICAgICov
CisgICAgc2V0IG1pbWVUeXBlKG1pbWVUeXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5faGlnaGxp
Z2h0ZXIubWltZVR5cGUgPSBtaW1lVHlwZTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBh
cmFtIHtib29sZWFufSByZWFkT25seQorICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVxdWVzdEZv
Y3VzCisgICAgICovCisgICAgc2V0UmVhZE9ubHk6IGZ1bmN0aW9uKHJlYWRPbmx5LCByZXF1ZXN0
Rm9jdXMpCisgICAgeworICAgICAgICBpZiAodGhpcy5fcmVhZE9ubHkgPT09IHJlYWRPbmx5KQor
ICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRoaXMuYmVnaW5Eb21VcGRhdGVzKCk7Cisg
ICAgICAgIHRoaXMuX3JlYWRPbmx5ID0gcmVhZE9ubHk7CisgICAgICAgIGlmICh0aGlzLl9yZWFk
T25seSkKKyAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5yZW1vdmVTdHlsZUNsYXNzKCJ0ZXh0
LWVkaXRvci1lZGl0YWJsZSIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuX2Nv
bnRhaW5lci5hZGRTdHlsZUNsYXNzKCJ0ZXh0LWVkaXRvci1lZGl0YWJsZSIpOworICAgICAgICAg
ICAgaWYgKHJlcXVlc3RGb2N1cykKKyAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTZWxlY3Rp
b25PblN0YXJ0RWRpdGluZygpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZW5kRG9tVXBkYXRl
cygpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtib29sZWFufQorICAgICAq
LworICAgIHJlYWRPbmx5OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5f
cmVhZE9ubHk7CisgICAgfSwKKworICAgIF9oYW5kbGVFbGVtZW50Rm9jdXM6IGZ1bmN0aW9uKCkK
KyAgICB7CisgICAgICAgIGlmICghdGhpcy5fcmVhZE9ubHkpCisgICAgICAgICAgICB0aGlzLl9j
b250YWluZXIuZm9jdXMoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHJldHVybiB7RWxl
bWVudH0KKyAgICAgKi8KKyAgICBkZWZhdWx0Rm9jdXNlZEVsZW1lbnQ6IGZ1bmN0aW9uKCkKKyAg
ICB7CisgICAgICAgIGlmICh0aGlzLl9yZWFkT25seSkKKyAgICAgICAgICAgIHJldHVybiB0aGlz
LmVsZW1lbnQ7CisgICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7CisgICAgfSwKKworICAg
IF91cGRhdGVTZWxlY3Rpb25PblN0YXJ0RWRpdGluZzogZnVuY3Rpb24oKQorICAgIHsKKyAgICAg
ICAgLy8gZm9jdXMoKSBuZWVkcyB0byBnbyBmaXJzdCBmb3IgdGhlIGNhc2Ugd2hlbiB0aGUgbGFz
dCBzZWxlY3Rpb24gd2FzIGluc2lkZSB0aGUgZWRpdG9yIGFuZAorICAgICAgICAvLyB0aGUgIkVk
aXQiIGJ1dHRvbiB3YXMgY2xpY2tlZC4gSW4gdGhpcyBjYXNlIHdlIGJhaWwgYXQgdGhlIGNoZWNr
IGJlbG93LCBidXQgdGhlCisgICAgICAgIC8vIGVkaXRvciBkb2VzIG5vdCByZWNlaXZlIHRoZSBm
b2N1cywgdGh1cyAiRXNjIiBkb2VzIG5vdCBjYW5jZWwgZWRpdGluZyB1bnRpbCBhdCBsZWFzdAor
ICAgICAgICAvLyBvbmUgY2hhbmdlIGhhcyBiZWVuIG1hZGUgdG8gdGhlIGVkaXRvciBjb250ZW50
cy4KKyAgICAgICAgdGhpcy5fY29udGFpbmVyLmZvY3VzKCk7CisgICAgICAgIHZhciBzZWxlY3Rp
b24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VD
b3VudCkgeworICAgICAgICAgICAgdmFyIGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyID0gc2VsZWN0
aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7CisgICAgICAgICAgICBp
ZiAodGhpcy5fY29udGFpbmVyLmlzU2VsZk9yQW5jZXN0b3IoY29tbW9uQW5jZXN0b3JDb250YWlu
ZXIpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGVj
dGlvbi5yZW1vdmVBbGxSYW5nZXMoKTsKKyAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3Jl
YXRlUmFuZ2UoKTsKKyAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGhpcy5fY29udGFpbmVyLCAwKTsK
KyAgICAgICAgcmFuZ2Uuc2V0RW5kKHRoaXMuX2NvbnRhaW5lciwgMCk7CisgICAgICAgIHNlbGVj
dGlvbi5hZGRSYW5nZShyYW5nZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7
bnVtYmVyfSBzdGFydExpbmUKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kTGluZQorICAgICAq
LworICAgIHNldEVkaXRhYmxlUmFuZ2U6IGZ1bmN0aW9uKHN0YXJ0TGluZSwgZW5kTGluZSkKKyAg
ICB7CisgICAgICAgIHRoaXMuYmVnaW5Eb21VcGRhdGVzKCk7CisKKyAgICAgICAgdmFyIGZpcnN0
Q2h1bmtOdW1iZXIgPSB0aGlzLl9jaHVua051bWJlckZvckxpbmUoc3RhcnRMaW5lKTsKKyAgICAg
ICAgdmFyIGZpcnN0Q2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtzW2ZpcnN0Q2h1bmtOdW1iZXJdOwor
ICAgICAgICBpZiAoZmlyc3RDaHVuay5zdGFydExpbmUgIT09IHN0YXJ0TGluZSkgeworICAgICAg
ICAgICAgdGhpcy5fc3BsaXRDaHVua09uQUxpbmUoc3RhcnRMaW5lLCBmaXJzdENodW5rTnVtYmVy
KTsKKyAgICAgICAgICAgIGZpcnN0Q2h1bmtOdW1iZXIgKz0gMTsKKyAgICAgICAgfQorCisgICAg
ICAgIHZhciBsYXN0Q2h1bmtOdW1iZXIgPSB0aGlzLl90ZXh0Q2h1bmtzLmxlbmd0aDsKKyAgICAg
ICAgaWYgKGVuZExpbmUgIT09IHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50KSB7CisgICAgICAg
ICAgICBsYXN0Q2h1bmtOdW1iZXIgPSB0aGlzLl9jaHVua051bWJlckZvckxpbmUoZW5kTGluZSk7
CisgICAgICAgICAgICB2YXIgbGFzdENodW5rID0gdGhpcy5fdGV4dENodW5rc1tsYXN0Q2h1bmtO
dW1iZXJdOworICAgICAgICAgICAgaWYgKGxhc3RDaHVuayAmJiBsYXN0Q2h1bmsuc3RhcnRMaW5l
ICE9PSBlbmRMaW5lKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fc3BsaXRDaHVua09uQUxpbmUo
ZW5kTGluZSwgbGFzdENodW5rTnVtYmVyKTsKKyAgICAgICAgICAgICAgICBsYXN0Q2h1bmtOdW1i
ZXIgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAodmFyIGNo
dW5rTnVtYmVyID0gMDsgY2h1bmtOdW1iZXIgPCBmaXJzdENodW5rTnVtYmVyOyArK2NodW5rTnVt
YmVyKQorICAgICAgICAgICAgdGhpcy5fdGV4dENodW5rc1tjaHVua051bWJlcl0ucmVhZE9ubHkg
PSB0cnVlOworICAgICAgICBmb3IgKHZhciBjaHVua051bWJlciA9IGZpcnN0Q2h1bmtOdW1iZXI7
IGNodW5rTnVtYmVyIDwgbGFzdENodW5rTnVtYmVyOyArK2NodW5rTnVtYmVyKQorICAgICAgICAg
ICAgdGhpcy5fdGV4dENodW5rc1tjaHVua051bWJlcl0ucmVhZE9ubHkgPSBmYWxzZTsKKyAgICAg
ICAgZm9yICh2YXIgY2h1bmtOdW1iZXIgPSBsYXN0Q2h1bmtOdW1iZXI7IGNodW5rTnVtYmVyIDwg
dGhpcy5fdGV4dENodW5rcy5sZW5ndGg7ICsrY2h1bmtOdW1iZXIpCisgICAgICAgICAgICB0aGlz
Ll90ZXh0Q2h1bmtzW2NodW5rTnVtYmVyXS5yZWFkT25seSA9IHRydWU7CisKKyAgICAgICAgdGhp
cy5lbmREb21VcGRhdGVzKCk7CisgICAgfSwKKworICAgIGNsZWFyRWRpdGFibGVSYW5nZTogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgZm9yICh2YXIgY2h1bmtOdW1iZXIgPSAwOyBjaHVua051
bWJlciA8IHRoaXMuX3RleHRDaHVua3MubGVuZ3RoOyArK2NodW5rTnVtYmVyKQorICAgICAgICAg
ICAgdGhpcy5fdGV4dENodW5rc1tjaHVua051bWJlcl0ucmVhZE9ubHkgPSBmYWxzZTsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSByYW5n
ZQorICAgICAqLworICAgIG1hcmtBbmRSZXZlYWxSYW5nZTogZnVuY3Rpb24ocmFuZ2UpCisgICAg
eworICAgICAgICBpZiAodGhpcy5fcmFuZ2VUb01hcmspIHsKKyAgICAgICAgICAgIHZhciBtYXJr
ZWRMaW5lID0gdGhpcy5fcmFuZ2VUb01hcmsuc3RhcnRMaW5lOworICAgICAgICAgICAgZGVsZXRl
IHRoaXMuX3JhbmdlVG9NYXJrOworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBtYXJrZWQgcmVn
aW9uIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXJ0eUxpbmVzKSB7Cisg
ICAgICAgICAgICAgICAgdGhpcy5iZWdpbkRvbVVwZGF0ZXMoKTsKKyAgICAgICAgICAgICAgICB2
YXIgY2h1bmsgPSB0aGlzLmNodW5rRm9yTGluZShtYXJrZWRMaW5lKTsKKyAgICAgICAgICAgICAg
ICB2YXIgd2FzRXhwYW5kZWQgPSBjaHVuay5leHBhbmRlZDsKKyAgICAgICAgICAgICAgICBjaHVu
ay5leHBhbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNodW5rLnVwZGF0ZUNvbGxhcHNl
ZExpbmVSb3coKTsKKyAgICAgICAgICAgICAgICBjaHVuay5leHBhbmRlZCA9IHdhc0V4cGFuZGVk
OworICAgICAgICAgICAgICAgIHRoaXMuZW5kRG9tVXBkYXRlcygpOworICAgICAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICAgICAgdGhpcy5fcGFpbnRMaW5lcyhtYXJrZWRMaW5lLCBtYXJrZWRM
aW5lICsgMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmFuZ2UpIHsKKyAgICAgICAgICAg
IHRoaXMuX3JhbmdlVG9NYXJrID0gcmFuZ2U7CisgICAgICAgICAgICB0aGlzLnJldmVhbExpbmUo
cmFuZ2Uuc3RhcnRMaW5lKTsKKyAgICAgICAgICAgIHZhciBjaHVuayA9IHRoaXMubWFrZUxpbmVB
Q2h1bmsocmFuZ2Uuc3RhcnRMaW5lKTsKKyAgICAgICAgICAgIHRoaXMuX3BhaW50TGluZShjaHVu
ay5lbGVtZW50KTsKKyAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZWRSYW5nZUVsZW1lbnQpCisg
ICAgICAgICAgICAgICAgdGhpcy5fbWFya2VkUmFuZ2VFbGVtZW50LnNjcm9sbEludG9WaWV3SWZO
ZWVkZWQoKTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgdGhpcy5fbWFya2VkUmFuZ2VFbGVt
ZW50OworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU51bWJl
cgorICAgICAqLworICAgIGhpZ2hsaWdodExpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCisgICAg
eworICAgICAgICB0aGlzLmNsZWFyTGluZUhpZ2hsaWdodCgpOworICAgICAgICB0aGlzLl9oaWdo
bGlnaHRlZExpbmUgPSBsaW5lTnVtYmVyOworICAgICAgICB0aGlzLnJldmVhbExpbmUobGluZU51
bWJlcik7CisKKyAgICAgICAgaWYgKCF0aGlzLl9yZWFkT25seSkKKyAgICAgICAgICAgIHRoaXMu
X3Jlc3RvcmVTZWxlY3Rpb24oV2ViSW5zcGVjdG9yLlRleHRSYW5nZS5jcmVhdGVGcm9tTG9jYXRp
b24obGluZU51bWJlciwgMCksIGZhbHNlKTsKKworICAgICAgICB0aGlzLmFkZERlY29yYXRpb24o
bGluZU51bWJlciwgIndlYmtpdC1oaWdobGlnaHRlZC1saW5lIik7CisgICAgfSwKKworICAgIGNs
ZWFyTGluZUhpZ2hsaWdodDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVvZiB0
aGlzLl9oaWdobGlnaHRlZExpbmUgPT09ICJudW1iZXIiKSB7CisgICAgICAgICAgICB0aGlzLnJl
bW92ZURlY29yYXRpb24odGhpcy5faGlnaGxpZ2h0ZWRMaW5lLCAid2Via2l0LWhpZ2hsaWdodGVk
LWxpbmUiKTsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9oaWdobGlnaHRlZExpbmU7CisgICAg
ICAgIH0KKyAgICB9LAorCisgICAgZnJlZUNhY2hlZEVsZW1lbnRzOiBmdW5jdGlvbigpCisgICAg
eworICAgICAgICB0aGlzLl9jYWNoZWRTcGFucyA9IFtdOworICAgICAgICB0aGlzLl9jYWNoZWRU
ZXh0Tm9kZXMgPSBbXTsKKyAgICAgICAgdGhpcy5fY2FjaGVkUm93cyA9IFtdOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlZG8KKyAgICAgKi8KKyAgICBoYW5k
bGVVbmRvUmVkbzogZnVuY3Rpb24ocmVkbykKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9kaXJ0
eUxpbmVzKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHRoaXMuYmVnaW5V
cGRhdGVzKCk7CisKKyAgICAgICAgZnVuY3Rpb24gYmVmb3JlKCkKKyAgICAgICAgeworICAgICAg
ICAgICAgdGhpcy5fZW50ZXJUZXh0Q2hhbmdlTW9kZSgpOworICAgICAgICB9CisKKyAgICAgICAg
ZnVuY3Rpb24gYWZ0ZXIob2xkUmFuZ2UsIG5ld1JhbmdlKQorICAgICAgICB7CisgICAgICAgICAg
ICB0aGlzLl9leGl0VGV4dENoYW5nZU1vZGUob2xkUmFuZ2UsIG5ld1JhbmdlKTsKKyAgICAgICAg
fQorCisgICAgICAgIHZhciByYW5nZSA9IHJlZG8gPyB0aGlzLl90ZXh0TW9kZWwucmVkbyhiZWZv
cmUuYmluZCh0aGlzKSwgYWZ0ZXIuYmluZCh0aGlzKSkgOiB0aGlzLl90ZXh0TW9kZWwudW5kbyhi
ZWZvcmUuYmluZCh0aGlzKSwgYWZ0ZXIuYmluZCh0aGlzKSk7CisKKyAgICAgICAgdGhpcy5lbmRV
cGRhdGVzKCk7CisKKyAgICAgICAgLy8gUmVzdG9yZSBsb2NhdGlvbiBwb3N0LXJlcGFpbnQuCisg
ICAgICAgIGlmIChyYW5nZSkKKyAgICAgICAgICAgIHRoaXMuX3Jlc3RvcmVTZWxlY3Rpb24ocmFu
Z2UsIHRydWUpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0sCisKKyAgICAvKioKKyAg
ICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNoaWZ0S2V5CisgICAgICovCisgICAgaGFuZGxlVGFiS2V5
UHJlc3M6IGZ1bmN0aW9uKHNoaWZ0S2V5KQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2RpcnR5
TGluZXMpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdmFyIHNlbGVjdGlv
biA9IHRoaXMuX2dldFNlbGVjdGlvbigpOworICAgICAgICBpZiAoIXNlbGVjdGlvbikKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb24ubm9y
bWFsaXplKCk7CisKKyAgICAgICAgdGhpcy5iZWdpblVwZGF0ZXMoKTsKKyAgICAgICAgdGhpcy5f
ZW50ZXJUZXh0Q2hhbmdlTW9kZSgpOworCisgICAgICAgIHZhciBuZXdSYW5nZTsKKyAgICAgICAg
dmFyIHJhbmdlV2FzRW1wdHkgPSByYW5nZS5pc0VtcHR5KCk7CisgICAgICAgIGlmIChzaGlmdEtl
eSkKKyAgICAgICAgICAgIG5ld1JhbmdlID0gdGhpcy5fdW5pbmRlbnRMaW5lcyhyYW5nZSk7Cisg
ICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHJhbmdlV2FzRW1wdHkpCisgICAgICAgICAg
ICAgICAgbmV3UmFuZ2UgPSB0aGlzLl9lZGl0UmFuZ2UocmFuZ2UsIFdlYkluc3BlY3Rvci5zZXR0
aW5ncy50ZXh0RWRpdG9ySW5kZW50LmdldCgpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICBuZXdSYW5nZSA9IHRoaXMuX2luZGVudExpbmVzKHJhbmdlKTsKKyAgICAgICAgfQor
CisgICAgICAgIHRoaXMuX2V4aXRUZXh0Q2hhbmdlTW9kZShyYW5nZSwgbmV3UmFuZ2UpOworICAg
ICAgICB0aGlzLmVuZFVwZGF0ZXMoKTsKKyAgICAgICAgaWYgKHJhbmdlV2FzRW1wdHkpCisgICAg
ICAgICAgICBuZXdSYW5nZS5zdGFydENvbHVtbiA9IG5ld1JhbmdlLmVuZENvbHVtbjsKKyAgICAg
ICAgdGhpcy5fcmVzdG9yZVNlbGVjdGlvbihuZXdSYW5nZSwgdHJ1ZSk7CisgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge1dlYkluc3BlY3Rvci5U
ZXh0UmFuZ2V9IHJhbmdlCisgICAgICovCisgICAgX2luZGVudExpbmVzOiBmdW5jdGlvbihyYW5n
ZSkKKyAgICB7CisgICAgICAgIHZhciBpbmRlbnQgPSBXZWJJbnNwZWN0b3Iuc2V0dGluZ3MudGV4
dEVkaXRvckluZGVudC5nZXQoKTsKKworICAgICAgICBpZiAodGhpcy5fbGFzdEVkaXRlZFJhbmdl
KQorICAgICAgICAgICAgdGhpcy5fdGV4dE1vZGVsLm1hcmtVbmRvYWJsZVN0YXRlKCk7CisKKyAg
ICAgICAgdmFyIG5ld1JhbmdlID0gcmFuZ2UuY2xvbmUoKTsKKworICAgICAgICAvLyBEbyBub3Qg
Y2hhbmdlIGEgc2VsZWN0aW9uIHN0YXJ0IHBvc2l0aW9uIHdoZW4gaXQgaXMgYXQgdGhlIGJlZ2lu
bmluZyBvZiBhIGxpbmUKKyAgICAgICAgaWYgKHJhbmdlLnN0YXJ0Q29sdW1uKQorICAgICAgICAg
ICAgbmV3UmFuZ2Uuc3RhcnRDb2x1bW4gKz0gaW5kZW50Lmxlbmd0aDsKKworICAgICAgICB2YXIg
aW5kZW50RW5kTGluZSA9IHJhbmdlLmVuZExpbmU7CisgICAgICAgIGlmIChyYW5nZS5lbmRDb2x1
bW4pCisgICAgICAgICAgICBuZXdSYW5nZS5lbmRDb2x1bW4gKz0gaW5kZW50Lmxlbmd0aDsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgaW5kZW50RW5kTGluZS0tOworCisgICAgICAgIGZvciAo
dmFyIGxpbmVOdW1iZXIgPSByYW5nZS5zdGFydExpbmU7IGxpbmVOdW1iZXIgPD0gaW5kZW50RW5k
TGluZTsgbGluZU51bWJlcisrKQorICAgICAgICAgICAgdGhpcy5fdGV4dE1vZGVsLmVkaXRSYW5n
ZShXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbihsaW5lTnVtYmVyLCAw
KSwgaW5kZW50KTsKKworICAgICAgICB0aGlzLl9sYXN0RWRpdGVkUmFuZ2UgPSBuZXdSYW5nZTsK
KworICAgICAgICByZXR1cm4gbmV3UmFuZ2U7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBw
YXJhbSB7V2ViSW5zcGVjdG9yLlRleHRSYW5nZX0gcmFuZ2UKKyAgICAgKi8KKyAgICBfdW5pbmRl
bnRMaW5lczogZnVuY3Rpb24ocmFuZ2UpCisgICAgeworICAgICAgICBpZiAodGhpcy5fbGFzdEVk
aXRlZFJhbmdlKQorICAgICAgICAgICAgdGhpcy5fdGV4dE1vZGVsLm1hcmtVbmRvYWJsZVN0YXRl
KCk7CisKKyAgICAgICAgdmFyIGluZGVudCA9IFdlYkluc3BlY3Rvci5zZXR0aW5ncy50ZXh0RWRp
dG9ySW5kZW50LmdldCgpOworICAgICAgICB2YXIgaW5kZW50TGVuZ3RoID0gaW5kZW50ID09PSBX
ZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLkluZGVudC5UYWJDaGFyYWN0ZXIgPyA0IDogaW5k
ZW50Lmxlbmd0aDsKKyAgICAgICAgdmFyIGxpbmVJbmRlbnRSZWdleCA9IG5ldyBSZWdFeHAoIl4g
ezEsIiArIGluZGVudExlbmd0aCArICJ9Iik7CisgICAgICAgIHZhciBuZXdSYW5nZSA9IHJhbmdl
LmNsb25lKCk7CisKKyAgICAgICAgdmFyIGluZGVudEVuZExpbmUgPSByYW5nZS5lbmRMaW5lOwor
ICAgICAgICBpZiAoIXJhbmdlLmVuZENvbHVtbikKKyAgICAgICAgICAgIGluZGVudEVuZExpbmUt
LTsKKworICAgICAgICBmb3IgKHZhciBsaW5lTnVtYmVyID0gcmFuZ2Uuc3RhcnRMaW5lOyBsaW5l
TnVtYmVyIDw9IGluZGVudEVuZExpbmU7IGxpbmVOdW1iZXIrKykgeworICAgICAgICAgICAgdmFy
IGxpbmUgPSB0aGlzLl90ZXh0TW9kZWwubGluZShsaW5lTnVtYmVyKTsKKyAgICAgICAgICAgIHZh
ciBmaXJzdENoYXJhY3RlciA9IGxpbmUuY2hhckF0KDApOworICAgICAgICAgICAgdmFyIGxpbmVJ
bmRlbnRMZW5ndGg7CisKKyAgICAgICAgICAgIGlmIChmaXJzdENoYXJhY3RlciA9PT0gIiAiKQor
ICAgICAgICAgICAgICAgIGxpbmVJbmRlbnRMZW5ndGggPSBsaW5lLm1hdGNoKGxpbmVJbmRlbnRS
ZWdleClbMF0ubGVuZ3RoOworICAgICAgICAgICAgZWxzZSBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09
ICJcdCIpCisgICAgICAgICAgICAgICAgbGluZUluZGVudExlbmd0aCA9IDE7CisgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHRoaXMuX3Rl
eHRNb2RlbC5lZGl0UmFuZ2UobmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UobGluZU51bWJlciwg
MCwgbGluZU51bWJlciwgbGluZUluZGVudExlbmd0aCksICIiKTsKKworICAgICAgICAgICAgaWYg
KGxpbmVOdW1iZXIgPT09IHJhbmdlLnN0YXJ0TGluZSkKKyAgICAgICAgICAgICAgICBuZXdSYW5n
ZS5zdGFydENvbHVtbiA9IE1hdGgubWF4KDAsIG5ld1JhbmdlLnN0YXJ0Q29sdW1uIC0gbGluZUlu
ZGVudExlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGluZUluZGVudExlbmd0aCkK
KyAgICAgICAgICAgIG5ld1JhbmdlLmVuZENvbHVtbiA9IE1hdGgubWF4KDAsIG5ld1JhbmdlLmVu
ZENvbHVtbiAtIGxpbmVJbmRlbnRMZW5ndGgpOworCisgICAgICAgIHRoaXMuX2xhc3RFZGl0ZWRS
YW5nZSA9IG5ld1JhbmdlOworCisgICAgICAgIHJldHVybiBuZXdSYW5nZTsKKyAgICB9LAorCisg
ICAgaGFuZGxlRW50ZXJLZXk6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9k
aXJ0eUxpbmVzKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHZhciByYW5n
ZSA9IHRoaXMuX2dldFNlbGVjdGlvbigpOworICAgICAgICBpZiAoIXJhbmdlKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJhbmdlID0gcmFuZ2Uubm9ybWFsaXplKCk7CisK
KyAgICAgICAgaWYgKHJhbmdlLmVuZENvbHVtbiA9PT0gMCkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgICAgICB2YXIgbGluZSA9IHRoaXMuX3RleHRNb2RlbC5saW5lKHJhbmdlLnN0
YXJ0TGluZSk7CisgICAgICAgIHZhciBsaW5lUHJlZml4ID0gbGluZS5zdWJzdHJpbmcoMCwgcmFu
Z2Uuc3RhcnRDb2x1bW4pOworICAgICAgICB2YXIgaW5kZW50TWF0Y2ggPSBsaW5lUHJlZml4Lm1h
dGNoKC9eXHMrLyk7CisgICAgICAgIHZhciBjdXJyZW50SW5kZW50ID0gaW5kZW50TWF0Y2ggPyBp
bmRlbnRNYXRjaFswXSA6ICIiOworCisgICAgICAgIHZhciB0ZXh0RWRpdG9ySW5kZW50ID0gV2Vi
SW5zcGVjdG9yLnNldHRpbmdzLnRleHRFZGl0b3JJbmRlbnQuZ2V0KCk7CisgICAgICAgIHZhciBp
bmRlbnQgPSBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLmVuZHNXaXRoQnJhY2tldFJlZ2V4
LnRlc3QobGluZVByZWZpeCkgPyBjdXJyZW50SW5kZW50ICsgdGV4dEVkaXRvckluZGVudCA6IGN1
cnJlbnRJbmRlbnQ7CisKKyAgICAgICAgaWYgKCFpbmRlbnQpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgdGhpcy5iZWdpblVwZGF0ZXMoKTsKKyAgICAgICAgdGhpcy5fZW50
ZXJUZXh0Q2hhbmdlTW9kZSgpOworCisgICAgICAgIHZhciBsaW5lQnJlYWsgPSB0aGlzLl90ZXh0
TW9kZWwubGluZUJyZWFrOworICAgICAgICB2YXIgbmV3UmFuZ2U7CisgICAgICAgIGlmIChyYW5n
ZS5pc0VtcHR5KCkgJiYgbGluZS5zdWJzdHIocmFuZ2UuZW5kQ29sdW1uIC0gMSwgMikgPT09ICd7
fScpIHsKKyAgICAgICAgICAgIC8vIHt8fQorICAgICAgICAgICAgLy8gYmVjb21lcworICAgICAg
ICAgICAgLy8geworICAgICAgICAgICAgLy8gICAgIHwKKyAgICAgICAgICAgIC8vIH0KKyAgICAg
ICAgICAgIG5ld1JhbmdlID0gdGhpcy5fZWRpdFJhbmdlKHJhbmdlLCBsaW5lQnJlYWsgKyBpbmRl
bnQgKyBsaW5lQnJlYWsgKyBjdXJyZW50SW5kZW50KTsKKyAgICAgICAgICAgIG5ld1JhbmdlLmVu
ZExpbmUtLTsKKyAgICAgICAgICAgIG5ld1JhbmdlLmVuZENvbHVtbiArPSB0ZXh0RWRpdG9ySW5k
ZW50Lmxlbmd0aDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBuZXdSYW5nZSA9IHRoaXMu
X2VkaXRSYW5nZShyYW5nZSwgbGluZUJyZWFrICsgaW5kZW50KTsKKworICAgICAgICB0aGlzLl9l
eGl0VGV4dENoYW5nZU1vZGUocmFuZ2UsIG5ld1JhbmdlKTsKKyAgICAgICAgdGhpcy5lbmRVcGRh
dGVzKCk7CisgICAgICAgIHRoaXMuX3Jlc3RvcmVTZWxlY3Rpb24obmV3UmFuZ2UuY29sbGFwc2VU
b0VuZCgpLCB0cnVlKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAorCisgICAgLyoq
CisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIKKyAgICAgKiBAcGFyYW0ge251bWJl
cn0gY2h1bmtOdW1iZXIKKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBjcmVhdGVTdWZmaXhDaHVu
aworICAgICAqLworICAgIF9zcGxpdENodW5rT25BTGluZTogZnVuY3Rpb24obGluZU51bWJlciwg
Y2h1bmtOdW1iZXIsIGNyZWF0ZVN1ZmZpeENodW5rKQorICAgIHsKKyAgICAgICAgdmFyIHNlbGVj
dGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbigpOworICAgICAgICB2YXIgY2h1bmsgPSBXZWJJbnNw
ZWN0b3IuVGV4dEVkaXRvckNodW5rZWRQYW5lbC5wcm90b3R5cGUuX3NwbGl0Q2h1bmtPbkFMaW5l
LmNhbGwodGhpcywgbGluZU51bWJlciwgY2h1bmtOdW1iZXIsIGNyZWF0ZVN1ZmZpeENodW5rKTsK
KyAgICAgICAgdGhpcy5fcmVzdG9yZVNlbGVjdGlvbihzZWxlY3Rpb24pOworICAgICAgICByZXR1
cm4gY2h1bms7CisgICAgfSwKKworICAgIGJlZ2luRG9tVXBkYXRlczogZnVuY3Rpb24oKQorICAg
IHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2VkUGFuZWwucHJvdG90eXBl
LmJlZ2luRG9tVXBkYXRlcy5jYWxsKHRoaXMpOworICAgICAgICBpZiAodGhpcy5fZG9tVXBkYXRl
Q29hbGVzY2luZ0xldmVsID09PSAxKSB7CisgICAgICAgICAgICB0aGlzLl9jb250YWluZXIucmVt
b3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkIiwgdGhpcy5faGFuZGxl
RE9NVXBkYXRlc0NhbGxiYWNrLCBmYWxzZSk7CisgICAgICAgICAgICB0aGlzLl9jb250YWluZXIu
cmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTm9kZUluc2VydGVkIiwgdGhpcy5faGFuZGxlRE9NVXBk
YXRlc0NhbGxiYWNrLCBmYWxzZSk7CisgICAgICAgICAgICB0aGlzLl9jb250YWluZXIucmVtb3Zl
RXZlbnRMaXN0ZW5lcigiRE9NU3VidHJlZU1vZGlmaWVkIiwgdGhpcy5faGFuZGxlRE9NVXBkYXRl
c0NhbGxiYWNrLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgZW5kRG9tVXBkYXRl
czogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVu
a2VkUGFuZWwucHJvdG90eXBlLmVuZERvbVVwZGF0ZXMuY2FsbCh0aGlzKTsKKyAgICAgICAgaWYg
KHRoaXMuX2RvbVVwZGF0ZUNvYWxlc2NpbmdMZXZlbCA9PT0gMCkgeworICAgICAgICAgICAgdGhp
cy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZCIs
IHRoaXMuX2hhbmRsZURPTVVwZGF0ZXNDYWxsYmFjaywgZmFsc2UpOworICAgICAgICAgICAgdGhp
cy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoIkRPTU5vZGVJbnNlcnRlZCIsIHRoaXMuX2hh
bmRsZURPTVVwZGF0ZXNDYWxsYmFjaywgZmFsc2UpOworICAgICAgICAgICAgdGhpcy5fY29udGFp
bmVyLmFkZEV2ZW50TGlzdGVuZXIoIkRPTVN1YnRyZWVNb2RpZmllZCIsIHRoaXMuX2hhbmRsZURP
TVVwZGF0ZXNDYWxsYmFjaywgZmFsc2UpOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKgor
ICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbGluZVJvdworICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0g
ZW5hYmxlCisgICAgICovCisgICAgX2VuYWJsZURPTU5vZGVSZW1vdmVkTGlzdGVuZXI6IGZ1bmN0
aW9uKGxpbmVSb3csIGVuYWJsZSkKKyAgICB7CisgICAgICAgIGlmIChlbmFibGUpCisgICAgICAg
ICAgICBsaW5lUm93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU5vZGVSZW1vdmVkIiwgdGhpcy5faGFu
ZGxlRE9NVXBkYXRlc0NhbGxiYWNrLCBmYWxzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IGxpbmVSb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTm9kZVJlbW92ZWQiLCB0aGlzLl9oYW5k
bGVET01VcGRhdGVzQ2FsbGJhY2ssIGZhbHNlKTsKKyAgICB9LAorCisgICAgX2J1aWxkQ2h1bmtz
OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Rl
eHRNb2RlbC5saW5lc0NvdW50OyArK2kpCisgICAgICAgICAgICB0aGlzLl90ZXh0TW9kZWwucmVt
b3ZlQXR0cmlidXRlKGksICJoaWdobGlnaHQiKTsKKworICAgICAgICBXZWJJbnNwZWN0b3IuVGV4
dEVkaXRvckNodW5rZWRQYW5lbC5wcm90b3R5cGUuX2J1aWxkQ2h1bmtzLmNhbGwodGhpcyk7Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydExpbmUKKyAgICAg
KiBAcGFyYW0ge251bWJlcn0gZW5kTGluZQorICAgICAqLworICAgIF9jcmVhdGVOZXdDaHVuazog
ZnVuY3Rpb24oc3RhcnRMaW5lLCBlbmRMaW5lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBX
ZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5DaHVuayh0aGlzLCBzdGFydExpbmUsIGVuZExpbmUp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4Cisg
ICAgICogQHBhcmFtIHtudW1iZXJ9IHRvSW5kZXgKKyAgICAgKi8KKyAgICBfZXhwYW5kQ2h1bmtz
OiBmdW5jdGlvbihmcm9tSW5kZXgsIHRvSW5kZXgpCisgICAgeworICAgICAgICB2YXIgbGFzdENo
dW5rID0gdGhpcy5fdGV4dENodW5rc1t0b0luZGV4IC0gMV07CisgICAgICAgIHZhciBsYXN0Vmlz
aWJsZUxpbmUgPSBsYXN0Q2h1bmsuc3RhcnRMaW5lICsgbGFzdENodW5rLmxpbmVzQ291bnQ7CisK
KyAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbigpOworCisgICAgICAg
IHRoaXMuX211dGVIaWdobGlnaHRMaXN0ZW5lciA9IHRydWU7CisgICAgICAgIHRoaXMuX2hpZ2hs
aWdodGVyLmhpZ2hsaWdodChsYXN0VmlzaWJsZUxpbmUpOworICAgICAgICBkZWxldGUgdGhpcy5f
bXV0ZUhpZ2hsaWdodExpc3RlbmVyOworCisgICAgICAgIHRoaXMuX3Jlc3RvcmVQYWludExpbmVz
T3BlcmF0aW9uc0NyZWRpdCgpOworICAgICAgICBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckNodW5r
ZWRQYW5lbC5wcm90b3R5cGUuX2V4cGFuZENodW5rcy5jYWxsKHRoaXMsIGZyb21JbmRleCwgdG9J
bmRleCk7CisgICAgICAgIHRoaXMuX2FkanVzdFBhaW50TGluZXNPcGVyYXRpb25zUmVmcmVzaFZh
bHVlKCk7CisKKyAgICAgICAgdGhpcy5fcmVzdG9yZVNlbGVjdGlvbihzZWxlY3Rpb24pOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUxpbmUKKyAgICAgKiBA
cGFyYW0ge251bWJlcn0gdG9MaW5lCisgICAgICovCisgICAgX2hpZ2hsaWdodERhdGFSZWFkeTog
ZnVuY3Rpb24oZnJvbUxpbmUsIHRvTGluZSkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9tdXRl
SGlnaGxpZ2h0TGlzdGVuZXIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRoaXMuX3Jl
c3RvcmVQYWludExpbmVzT3BlcmF0aW9uc0NyZWRpdCgpOworICAgICAgICB0aGlzLl9wYWludExp
bmVzKGZyb21MaW5lLCB0b0xpbmUsIHRydWUgLypyZXN0b3JlU2VsZWN0aW9uKi8pOworICAgIH0s
CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRMaW5lCisgICAgICogQHBh
cmFtIHtudW1iZXJ9IGVuZExpbmUKKyAgICAgKi8KKyAgICBfc2NoZWR1bGVQYWludExpbmVzOiBm
dW5jdGlvbihzdGFydExpbmUsIGVuZExpbmUpCisgICAgeworICAgICAgICBpZiAoc3RhcnRMaW5l
ID49IGVuZExpbmUpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKCF0aGlzLl9z
Y2hlZHVsZWRQYWludExpbmVzKSB7CisgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRQYWludExp
bmVzID0gWyB7IHN0YXJ0TGluZTogc3RhcnRMaW5lLCBlbmRMaW5lOiBlbmRMaW5lIH0gXTsKKyAg
ICAgICAgICAgIHRoaXMuX3BhaW50U2NoZWR1bGVkTGluZXNUaW1lciA9IHNldFRpbWVvdXQodGhp
cy5fcGFpbnRTY2hlZHVsZWRMaW5lcy5iaW5kKHRoaXMpLCAwKTsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2NoZWR1bGVkUGFpbnRMaW5l
cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHZhciBjaHVuayA9IHRoaXMuX3NjaGVk
dWxlZFBhaW50TGluZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGNodW5rLnN0YXJ0TGluZSA8
PSBlbmRMaW5lICYmIGNodW5rLmVuZExpbmUgPj0gc3RhcnRMaW5lKSB7CisgICAgICAgICAgICAg
ICAgICAgIGNodW5rLnN0YXJ0TGluZSA9IE1hdGgubWluKGNodW5rLnN0YXJ0TGluZSwgc3RhcnRM
aW5lKTsKKyAgICAgICAgICAgICAgICAgICAgY2h1bmsuZW5kTGluZSA9IE1hdGgubWF4KGNodW5r
LmVuZExpbmUsIGVuZExpbmUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaHVuay5zdGFydExpbmUgPiBlbmRMaW5l
KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlZFBhaW50TGluZXMuc3BsaWNl
KGksIDAsIHsgc3RhcnRMaW5lOiBzdGFydExpbmUsIGVuZExpbmU6IGVuZExpbmUgfSk7CisgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRQYWludExpbmVzLnB1c2goeyBzdGFydExpbmU6
IHN0YXJ0TGluZSwgZW5kTGluZTogZW5kTGluZSB9KTsKKyAgICAgICAgfQorICAgIH0sCisKKyAg
ICAvKioKKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBSZXN0b3JlU2VsZWN0aW9uCisgICAg
ICovCisgICAgX3BhaW50U2NoZWR1bGVkTGluZXM6IGZ1bmN0aW9uKHNraXBSZXN0b3JlU2VsZWN0
aW9uKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3BhaW50U2NoZWR1bGVkTGluZXNUaW1lcikK
KyAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wYWludFNjaGVkdWxlZExpbmVzVGltZXIp
OworICAgICAgICBkZWxldGUgdGhpcy5fcGFpbnRTY2hlZHVsZWRMaW5lc1RpbWVyOworCisgICAg
ICAgIGlmICghdGhpcy5fc2NoZWR1bGVkUGFpbnRMaW5lcykKKyAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICAvLyBSZXNjaGVkdWxlIHRoZSB0aW1lciBpZiB3ZSBjYW4gbm90IHBhaW50IHRo
ZSBsaW5lcyB5ZXQsIG9yIHRoZSB1c2VyIGlzIHNjcm9sbGluZy4KKyAgICAgICAgaWYgKHRoaXMu
X2RpcnR5TGluZXMgfHwgdGhpcy5fcmVwYWludEFsbFRpbWVyKSB7CisgICAgICAgICAgICB0aGlz
Ll9wYWludFNjaGVkdWxlZExpbmVzVGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuX3BhaW50U2NoZWR1
bGVkTGluZXMuYmluZCh0aGlzKSwgNTApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisKKyAgICAgICAgdmFyIHNjaGVkdWxlZFBhaW50TGluZXMgPSB0aGlzLl9zY2hlZHVsZWRQYWlu
dExpbmVzOworICAgICAgICBkZWxldGUgdGhpcy5fc2NoZWR1bGVkUGFpbnRMaW5lczsKKworICAg
ICAgICB0aGlzLl9yZXN0b3JlUGFpbnRMaW5lc09wZXJhdGlvbnNDcmVkaXQoKTsKKyAgICAgICAg
dGhpcy5fcGFpbnRMaW5lQ2h1bmtzKHNjaGVkdWxlZFBhaW50TGluZXMsICFza2lwUmVzdG9yZVNl
bGVjdGlvbik7CisgICAgICAgIHRoaXMuX2FkanVzdFBhaW50TGluZXNPcGVyYXRpb25zUmVmcmVz
aFZhbHVlKCk7CisgICAgfSwKKworICAgIF9yZXN0b3JlUGFpbnRMaW5lc09wZXJhdGlvbnNDcmVk
aXQ6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5fcGFpbnRMaW5lc09wZXJh
dGlvbnNSZWZyZXNoVmFsdWUpCisgICAgICAgICAgICB0aGlzLl9wYWludExpbmVzT3BlcmF0aW9u
c1JlZnJlc2hWYWx1ZSA9IDI1MDsKKyAgICAgICAgdGhpcy5fcGFpbnRMaW5lc09wZXJhdGlvbnND
cmVkaXQgPSB0aGlzLl9wYWludExpbmVzT3BlcmF0aW9uc1JlZnJlc2hWYWx1ZTsKKyAgICAgICAg
dGhpcy5fcGFpbnRMaW5lc09wZXJhdGlvbnNMYXN0UmVmcmVzaCA9IERhdGUubm93KCk7CisgICAg
fSwKKworICAgIF9hZGp1c3RQYWludExpbmVzT3BlcmF0aW9uc1JlZnJlc2hWYWx1ZTogZnVuY3Rp
b24oKQorICAgIHsKKyAgICAgICAgdmFyIG9wZXJhdGlvbnNEb25lID0gdGhpcy5fcGFpbnRMaW5l
c09wZXJhdGlvbnNSZWZyZXNoVmFsdWUgLSB0aGlzLl9wYWludExpbmVzT3BlcmF0aW9uc0NyZWRp
dDsKKyAgICAgICAgaWYgKG9wZXJhdGlvbnNEb25lIDw9IDApCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIHZhciB0aW1lUGFzdCA9IERhdGUubm93KCkgLSB0aGlzLl9wYWludExpbmVzT3Bl
cmF0aW9uc0xhc3RSZWZyZXNoOworICAgICAgICBpZiAodGltZVBhc3QgPD0gMCkKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgLy8gTWFrZSB0aGUgc3luY2hyb25vdXMgQ1BVIGNodW5rIGZv
ciBwYWludGluZyB0aGUgbGluZXMgNTAgbXNlYy4KKyAgICAgICAgdmFyIHZhbHVlID0gTWF0aC5m
bG9vcihvcGVyYXRpb25zRG9uZSAvIHRpbWVQYXN0ICogNTApOworICAgICAgICB0aGlzLl9wYWlu
dExpbmVzT3BlcmF0aW9uc1JlZnJlc2hWYWx1ZSA9IE51bWJlci5jb25zdHJhaW4odmFsdWUsIDE1
MCwgMTUwMCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9t
TGluZQorICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b0xpbmUKKyAgICAgKiBAcGFyYW0ge2Jvb2xl
YW49fSByZXN0b3JlU2VsZWN0aW9uCisgICAgICovCisgICAgX3BhaW50TGluZXM6IGZ1bmN0aW9u
KGZyb21MaW5lLCB0b0xpbmUsIHJlc3RvcmVTZWxlY3Rpb24pCisgICAgeworICAgICAgICB0aGlz
Ll9wYWludExpbmVDaHVua3MoWyB7IHN0YXJ0TGluZTogZnJvbUxpbmUsIGVuZExpbmU6IHRvTGlu
ZSB9IF0sIHJlc3RvcmVTZWxlY3Rpb24pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFy
YW0ge2Jvb2xlYW49fSByZXN0b3JlU2VsZWN0aW9uCisgICAgICovCisgICAgX3BhaW50TGluZUNo
dW5rczogZnVuY3Rpb24obGluZUNodW5rcywgcmVzdG9yZVNlbGVjdGlvbikKKyAgICB7CisgICAg
ICAgIC8vIEZpcnN0LCBwYWludCB2aXNpYmxlIGxpbmVzLCBzbyB0aGF0IGluIGNhc2Ugb2YgbG9u
ZyBsaW5lcyB3ZSBzaG91bGQgc3RhcnQgaGlnaGxpZ2h0aW5nCisgICAgICAgIC8vIHRoZSB2aXNp
YmxlIGFyZWEgaW1tZWRpYXRlbHksIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIGxpbmVzIGFi
b3ZlIHRoZSB2aXNpYmxlIGFyZWEuCisgICAgICAgIHZhciB2aXNpYmxlRnJvbSA9IHRoaXMuZWxl
bWVudC5zY3JvbGxUb3A7CisgICAgICAgIHZhciBmaXJzdFZpc2libGVMaW5lTnVtYmVyID0gdGhp
cy5fZmluZEZpcnN0VmlzaWJsZUxpbmVOdW1iZXIodmlzaWJsZUZyb20pOworCisgICAgICAgIHZh
ciBjaHVuazsKKyAgICAgICAgdmFyIHNlbGVjdGlvbjsKKyAgICAgICAgdmFyIGludmlzaWJsZUxp
bmVSb3dzID0gW107CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZUNodW5rcy5sZW5n
dGg7ICsraSkgeworICAgICAgICAgICAgdmFyIGxpbmVDaHVuayA9IGxpbmVDaHVua3NbaV07Cisg
ICAgICAgICAgICBpZiAodGhpcy5fZGlydHlMaW5lcyB8fCB0aGlzLl9zY2hlZHVsZWRQYWludExp
bmVzKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVQYWludExpbmVzKGxpbmVDaHVu
ay5zdGFydExpbmUsIGxpbmVDaHVuay5lbmRMaW5lKTsKKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAodmFyIGxpbmVOdW1iZXIgPSBsaW5l
Q2h1bmsuc3RhcnRMaW5lOyBsaW5lTnVtYmVyIDwgbGluZUNodW5rLmVuZExpbmU7ICsrbGluZU51
bWJlcikgeworICAgICAgICAgICAgICAgIGlmICghY2h1bmsgfHwgbGluZU51bWJlciA8IGNodW5r
LnN0YXJ0TGluZSB8fCBsaW5lTnVtYmVyID49IGNodW5rLnN0YXJ0TGluZSArIGNodW5rLmxpbmVz
Q291bnQpCisgICAgICAgICAgICAgICAgICAgIGNodW5rID0gdGhpcy5jaHVua0ZvckxpbmUobGlu
ZU51bWJlcik7CisgICAgICAgICAgICAgICAgdmFyIGxpbmVSb3cgPSBjaHVuay5nZXRFeHBhbmRl
ZExpbmVSb3cobGluZU51bWJlcik7CisgICAgICAgICAgICAgICAgaWYgKCFsaW5lUm93KQorICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAobGluZU51bWJl
ciA8IGZpcnN0VmlzaWJsZUxpbmVOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW52aXNp
YmxlTGluZVJvd3MucHVzaChsaW5lUm93KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXN0b3JlU2VsZWN0aW9u
ICYmICFzZWxlY3Rpb24pCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuX2dl
dFNlbGVjdGlvbigpOworICAgICAgICAgICAgICAgIHRoaXMuX3BhaW50TGluZShsaW5lUm93KTsK
KyAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGFpbnRMaW5lc09wZXJhdGlvbnNDcmVkaXQgPCAw
KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlUGFpbnRMaW5lcyhsaW5lTnVt
YmVyICsgMSwgbGluZUNodW5rLmVuZExpbmUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBm
b3IgKHZhciBpID0gMDsgaSA8IGludmlzaWJsZUxpbmVSb3dzLmxlbmd0aDsgKytpKSB7CisgICAg
ICAgICAgICBpZiAocmVzdG9yZVNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uKQorICAgICAgICAgICAg
ICAgIHNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbigpOworICAgICAgICAgICAgdGhpcy5f
cGFpbnRMaW5lKGludmlzaWJsZUxpbmVSb3dzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGlm
IChyZXN0b3JlU2VsZWN0aW9uKQorICAgICAgICAgICAgdGhpcy5fcmVzdG9yZVNlbGVjdGlvbihz
ZWxlY3Rpb24pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGxp
bmVSb3cKKyAgICAgKi8KKyAgICBfcGFpbnRMaW5lOiBmdW5jdGlvbihsaW5lUm93KQorICAgIHsK
KyAgICAgICAgdmFyIGxpbmVOdW1iZXIgPSBsaW5lUm93LmxpbmVOdW1iZXI7CisgICAgICAgIGlm
ICh0aGlzLl9kaXJ0eUxpbmVzKSB7CisgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVBhaW50TGlu
ZXMobGluZU51bWJlciwgbGluZU51bWJlciArIDEpOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisKKyAgICAgICAgdGhpcy5iZWdpbkRvbVVwZGF0ZXMoKTsKKyAgICAgICAgdHJ5IHsK
KyAgICAgICAgICAgIGlmICh0aGlzLl9zY2hlZHVsZWRQYWludExpbmVzIHx8IHRoaXMuX3BhaW50
TGluZXNPcGVyYXRpb25zQ3JlZGl0IDwgMCkgeworICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVk
dWxlUGFpbnRMaW5lcyhsaW5lTnVtYmVyLCBsaW5lTnVtYmVyICsgMSk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaGlnaGxpZ2h0ID0g
dGhpcy5fdGV4dE1vZGVsLmdldEF0dHJpYnV0ZShsaW5lTnVtYmVyLCAiaGlnaGxpZ2h0Iik7Cisg
ICAgICAgICAgICBpZiAoIWhpZ2hsaWdodCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgICAgIGxpbmVSb3cucmVtb3ZlQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgIHZhciBsaW5l
ID0gdGhpcy5fdGV4dE1vZGVsLmxpbmUobGluZU51bWJlcik7CisgICAgICAgICAgICBpZiAoIWxp
bmUpCisgICAgICAgICAgICAgICAgbGluZVJvdy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVF
bGVtZW50KCJiciIpKTsKKworICAgICAgICAgICAgdmFyIHBsYWluVGV4dFN0YXJ0ID0gLTE7Cisg
ICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOykgeworICAgICAgICAg
ICAgICAgIGlmIChqID4gMTAwMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGxpbmUg
aXMgdG9vIGxvbmcgLSBkbyBub3Qgd2FzdGUgY3ljbGVzIG9uIG1pbmlmaWVkIGpzIGhpZ2hsaWdo
dGluZy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWluVGV4dFN0YXJ0ID09PSAtMSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHBsYWluVGV4dFN0YXJ0ID0gajsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBhdHRy
aWJ1dGUgPSBoaWdobGlnaHRbal07CisgICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUgfHwg
IWF0dHJpYnV0ZS50b2tlblR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWluVGV4
dFN0YXJ0ID09PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWluVGV4dFN0YXJ0ID0g
ajsKKyAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgICAgIGlmIChwbGFpblRleHRTdGFydCAhPT0gLTEpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZFRleHROb2RlKGxpbmVSb3csIGxpbmUuc3Vic3Ry
aW5nKHBsYWluVGV4dFN0YXJ0LCBqKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFpblRl
eHRTdGFydCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgLS10aGlzLl9wYWludExpbmVz
T3BlcmF0aW9uc0NyZWRpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
ICAgICB0aGlzLl9hcHBlbmRTcGFuKGxpbmVSb3csIGxpbmUuc3Vic3RyaW5nKGosIGogKyBhdHRy
aWJ1dGUubGVuZ3RoKSwgYXR0cmlidXRlLnRva2VuVHlwZSk7CisgICAgICAgICAgICAgICAgICAg
IGogKz0gYXR0cmlidXRlLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgLS10aGlzLl9wYWlu
dExpbmVzT3BlcmF0aW9uc0NyZWRpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpZiAocGxhaW5UZXh0U3RhcnQgIT09IC0xKSB7CisgICAgICAgICAgICAg
ICAgdGhpcy5fYXBwZW5kVGV4dE5vZGUobGluZVJvdywgbGluZS5zdWJzdHJpbmcocGxhaW5UZXh0
U3RhcnQsIGxpbmUubGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgLS10aGlzLl9wYWludExpbmVz
T3BlcmF0aW9uc0NyZWRpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaW5lUm93
LmRlY29yYXRpb25zRWxlbWVudCkKKyAgICAgICAgICAgICAgICBsaW5lUm93LmFwcGVuZENoaWxk
KGxpbmVSb3cuZGVjb3JhdGlvbnNFbGVtZW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAg
ICAgICAgIGlmICh0aGlzLl9yYW5nZVRvTWFyayAmJiB0aGlzLl9yYW5nZVRvTWFyay5zdGFydExp
bmUgPT09IGxpbmVOdW1iZXIpCisgICAgICAgICAgICAgICAgdGhpcy5fbWFya2VkUmFuZ2VFbGVt
ZW50ID0gV2ViSW5zcGVjdG9yLmhpZ2hsaWdodFNlYXJjaFJlc3VsdChsaW5lUm93LCB0aGlzLl9y
YW5nZVRvTWFyay5zdGFydENvbHVtbiwgdGhpcy5fcmFuZ2VUb01hcmsuZW5kQ29sdW1uIC0gdGhp
cy5fcmFuZ2VUb01hcmsuc3RhcnRDb2x1bW4pOworICAgICAgICAgICAgdGhpcy5lbmREb21VcGRh
dGVzKCk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtFbGVt
ZW50fSBsaW5lUm93CisgICAgICovCisgICAgX3JlbGVhc2VMaW5lc0hpZ2hsaWdodDogZnVuY3Rp
b24obGluZVJvdykKKyAgICB7CisgICAgICAgIGlmICghbGluZVJvdykKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgaWYgKCJzcGFucyIgaW4gbGluZVJvdykgeworICAgICAgICAgICAgdmFy
IHNwYW5zID0gbGluZVJvdy5zcGFuczsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwg
c3BhbnMubGVuZ3RoOyArK2opCisgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkU3BhbnMucHVz
aChzcGFuc1tqXSk7CisgICAgICAgICAgICBkZWxldGUgbGluZVJvdy5zcGFuczsKKyAgICAgICAg
fQorICAgICAgICBpZiAoInRleHROb2RlcyIgaW4gbGluZVJvdykgeworICAgICAgICAgICAgdmFy
IHRleHROb2RlcyA9IGxpbmVSb3cudGV4dE5vZGVzOworICAgICAgICAgICAgZm9yICh2YXIgaiA9
IDA7IGogPCB0ZXh0Tm9kZXMubGVuZ3RoOyArK2opCisgICAgICAgICAgICAgICAgdGhpcy5fY2Fj
aGVkVGV4dE5vZGVzLnB1c2godGV4dE5vZGVzW2pdKTsKKyAgICAgICAgICAgIGRlbGV0ZSBsaW5l
Um93LnRleHROb2RlczsKKyAgICAgICAgfQorICAgICAgICB0aGlzLl9jYWNoZWRSb3dzLnB1c2go
bGluZVJvdyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge1dlYkluc3BlY3Rv
ci5UZXh0UmFuZ2V9CisgICAgICovCisgICAgX2dldFNlbGVjdGlvbjogZnVuY3Rpb24oKQorICAg
IHsKKyAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKKyAgICAg
ICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOwor
ICAgICAgICAvLyBTZWxlY3Rpb24gbWF5IGJlIG91dHNpZGUgb2YgdGhlIGVkaXRvci4KKyAgICAg
ICAgaWYgKCF0aGlzLl9jb250YWluZXIuaXNBbmNlc3RvcihzZWxlY3Rpb24uYW5jaG9yTm9kZSkg
fHwgIXRoaXMuX2NvbnRhaW5lci5pc0FuY2VzdG9yKHNlbGVjdGlvbi5mb2N1c05vZGUpKQorICAg
ICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHZhciBzdGFydCA9IHRoaXMuX3NlbGVjdGlv
blRvUG9zaXRpb24oc2VsZWN0aW9uLmFuY2hvck5vZGUsIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQp
OworICAgICAgICB2YXIgZW5kID0gc2VsZWN0aW9uLmlzQ29sbGFwc2VkID8gc3RhcnQgOiB0aGlz
Ll9zZWxlY3Rpb25Ub1Bvc2l0aW9uKHNlbGVjdGlvbi5mb2N1c05vZGUsIHNlbGVjdGlvbi5mb2N1
c09mZnNldCk7CisgICAgICAgIHJldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZShzdGFy
dC5saW5lLCBzdGFydC5jb2x1bW4sIGVuZC5saW5lLCBlbmQuY29sdW1uKTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2Nyb2xsSW50b1ZpZXcKKyAgICAgKi8K
KyAgICBfcmVzdG9yZVNlbGVjdGlvbjogZnVuY3Rpb24ocmFuZ2UsIHNjcm9sbEludG9WaWV3KQor
ICAgIHsKKyAgICAgICAgaWYgKCFyYW5nZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
dmFyIHN0YXJ0ID0gdGhpcy5fcG9zaXRpb25Ub1NlbGVjdGlvbihyYW5nZS5zdGFydExpbmUsIHJh
bmdlLnN0YXJ0Q29sdW1uKTsKKyAgICAgICAgdmFyIGVuZCA9IHJhbmdlLmlzRW1wdHkoKSA/IHN0
YXJ0IDogdGhpcy5fcG9zaXRpb25Ub1NlbGVjdGlvbihyYW5nZS5lbmRMaW5lLCByYW5nZS5lbmRD
b2x1bW4pOworICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4dGVudChz
dGFydC5jb250YWluZXIsIHN0YXJ0Lm9mZnNldCwgZW5kLmNvbnRhaW5lciwgZW5kLm9mZnNldCk7
CisKKyAgICAgICAgaWYgKHNjcm9sbEludG9WaWV3KSB7CisgICAgICAgICAgICBmb3IgKHZhciBu
b2RlID0gZW5kLmNvbnRhaW5lcjsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50RWxlbWVudCkgewor
ICAgICAgICAgICAgICAgIGlmIChub2RlLnNjcm9sbEludG9WaWV3SWZOZWVkZWQpIHsKKyAgICAg
ICAgICAgICAgICAgICAgbm9kZS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7CisgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge05vZGV9IGNvbnRhaW5lcgor
ICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQKKyAgICAgKi8KKyAgICBfc2VsZWN0aW9uVG9Q
b3NpdGlvbjogZnVuY3Rpb24oY29udGFpbmVyLCBvZmZzZXQpCisgICAgeworICAgICAgICBpZiAo
Y29udGFpbmVyID09PSB0aGlzLl9jb250YWluZXIgJiYgb2Zmc2V0ID09PSAwKQorICAgICAgICAg
ICAgcmV0dXJuIHsgbGluZTogMCwgY29sdW1uOiAwIH07CisgICAgICAgIGlmIChjb250YWluZXIg
PT09IHRoaXMuX2NvbnRhaW5lciAmJiBvZmZzZXQgPT09IDEpCisgICAgICAgICAgICByZXR1cm4g
eyBsaW5lOiB0aGlzLl90ZXh0TW9kZWwubGluZXNDb3VudCAtIDEsIGNvbHVtbjogdGhpcy5fdGV4
dE1vZGVsLmxpbmVMZW5ndGgodGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQgLSAxKSB9OworCisg
ICAgICAgIHZhciBsaW5lUm93ID0gdGhpcy5fZW5jbG9zaW5nTGluZVJvd09yU2VsZihjb250YWlu
ZXIpOworICAgICAgICB2YXIgbGluZU51bWJlciA9IGxpbmVSb3cubGluZU51bWJlcjsKKyAgICAg
ICAgaWYgKGNvbnRhaW5lciA9PT0gbGluZVJvdyAmJiBvZmZzZXQgPT09IDApCisgICAgICAgICAg
ICByZXR1cm4geyBsaW5lOiBsaW5lTnVtYmVyLCBjb2x1bW46IDAgfTsKKworICAgICAgICAvLyBU
aGlzIG1heSBiZSBjaHVuayBhbmQgY2h1bmtzIG1heSBjb250YWluIFxuLgorICAgICAgICB2YXIg
Y29sdW1uID0gMDsKKyAgICAgICAgdmFyIG5vZGUgPSBsaW5lUm93Lm5vZGVUeXBlID09PSBOb2Rl
LlRFWFRfTk9ERSA/IGxpbmVSb3cgOiBsaW5lUm93LnRyYXZlcnNlTmV4dFRleHROb2RlKGxpbmVS
b3cpOworICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBjb250YWluZXIpIHsKKyAgICAg
ICAgICAgIHZhciB0ZXh0ID0gbm9kZS50ZXh0Q29udGVudDsKKyAgICAgICAgICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICh0ZXh0
LmNoYXJBdChpKSA9PT0gIlxuIikgeworICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyKys7
CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbisrOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgbm9kZSA9IG5vZGUudHJhdmVyc2VOZXh0VGV4dE5vZGUobGluZVJvdyk7CisgICAgICAgIH0K
KworICAgICAgICBpZiAobm9kZSA9PT0gY29udGFpbmVyICYmIG9mZnNldCkgeworICAgICAgICAg
ICAgdmFyIHRleHQgPSBub2RlLnRleHRDb250ZW50OworICAgICAgICAgICAgZm9yICh2YXIgaSA9
IDA7IGkgPCBvZmZzZXQ7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChp
KSA9PT0gIlxuIikgeworICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyKys7CisgICAgICAg
ICAgICAgICAgICAgIGNvbHVtbiA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAg
ICAgICAgICAgICAgIGNvbHVtbisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IHJldHVybiB7IGxpbmU6IGxpbmVOdW1iZXIsIGNvbHVtbjogY29sdW1uIH07CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lCisgICAgICogQHBhcmFtIHtudW1i
ZXJ9IGNvbHVtbgorICAgICAqLworICAgIF9wb3NpdGlvblRvU2VsZWN0aW9uOiBmdW5jdGlvbihs
aW5lLCBjb2x1bW4pCisgICAgeworICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLmNodW5rRm9yTGlu
ZShsaW5lKTsKKyAgICAgICAgLy8gT25lLWxpbmVkIGNvbGxhcHNlZCBjaHVua3MgbWF5IHN0aWxs
IHN0YXkgaGlnaGxpZ2h0ZWQuCisgICAgICAgIHZhciBsaW5lUm93ID0gY2h1bmsubGluZXNDb3Vu
dCA9PT0gMSA/IGNodW5rLmVsZW1lbnQgOiBjaHVuay5nZXRFeHBhbmRlZExpbmVSb3cobGluZSk7
CisgICAgICAgIGlmIChsaW5lUm93KQorICAgICAgICAgICAgdmFyIHJhbmdlQm91bmRhcnkgPSBs
aW5lUm93LnJhbmdlQm91bmRhcnlGb3JPZmZzZXQoY29sdW1uKTsKKyAgICAgICAgZWxzZSB7Cisg
ICAgICAgICAgICB2YXIgb2Zmc2V0ID0gY29sdW1uOworICAgICAgICAgICAgZm9yICh2YXIgaSA9
IGNodW5rLnN0YXJ0TGluZTsgaSA8IGxpbmU7ICsraSkKKyAgICAgICAgICAgICAgICBvZmZzZXQg
Kz0gdGhpcy5fdGV4dE1vZGVsLmxpbmVMZW5ndGgoaSkgKyAxOyAvLyBcbgorICAgICAgICAgICAg
bGluZVJvdyA9IGNodW5rLmVsZW1lbnQ7CisgICAgICAgICAgICBpZiAobGluZVJvdy5maXJzdENo
aWxkKQorICAgICAgICAgICAgICAgIHZhciByYW5nZUJvdW5kYXJ5ID0geyBjb250YWluZXI6IGxp
bmVSb3cuZmlyc3RDaGlsZCwgb2Zmc2V0OiBvZmZzZXQgfTsKKyAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICB2YXIgcmFuZ2VCb3VuZGFyeSA9IHsgY29udGFpbmVyOiBsaW5lUm93LCBv
ZmZzZXQ6IDAgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmFuZ2VCb3VuZGFyeTsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50CisgICAgICovCisg
ICAgX2VuY2xvc2luZ0xpbmVSb3dPclNlbGY6IGZ1bmN0aW9uKGVsZW1lbnQpCisgICAgeworICAg
ICAgICB2YXIgbGluZVJvdyA9IGVsZW1lbnQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygi
d2Via2l0LWxpbmUtY29udGVudCIpOworICAgICAgICBpZiAobGluZVJvdykKKyAgICAgICAgICAg
IHJldHVybiBsaW5lUm93OworCisgICAgICAgIGZvciAobGluZVJvdyA9IGVsZW1lbnQ7IGxpbmVS
b3c7IGxpbmVSb3cgPSBsaW5lUm93LnBhcmVudEVsZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChs
aW5lUm93LnBhcmVudEVsZW1lbnQgPT09IHRoaXMuX2NvbnRhaW5lcikKKyAgICAgICAgICAgICAg
ICByZXR1cm4gbGluZVJvdzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CisgICAgICogQHBh
cmFtIHtzdHJpbmd9IGNvbnRlbnQKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lCisg
ICAgICovCisgICAgX2FwcGVuZFNwYW46IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQsIGNsYXNz
TmFtZSkKKyAgICB7CisgICAgICAgIGlmIChjbGFzc05hbWUgPT09ICJodG1sLXJlc291cmNlLWxp
bmsiIHx8IGNsYXNzTmFtZSA9PT0gImh0bWwtZXh0ZXJuYWwtbGluayIpIHsKKyAgICAgICAgICAg
IGVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlTGluayhjb250ZW50LCBjbGFzc05hbWUg
PT09ICJodG1sLWV4dGVybmFsLWxpbmsiKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICB2YXIgc3BhbiA9IHRoaXMuX2NhY2hlZFNwYW5zLnBvcCgpIHx8IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKKyAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSAid2Vi
a2l0LSIgKyBjbGFzc05hbWU7CisgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBjb250ZW50Owor
ICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHNwYW4pOworICAgICAgICBpZiAoISgic3BhbnMi
IGluIGVsZW1lbnQpKQorICAgICAgICAgICAgZWxlbWVudC5zcGFucyA9IFtdOworICAgICAgICBl
bGVtZW50LnNwYW5zLnB1c2goc3Bhbik7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJh
bSB7RWxlbWVudH0gZWxlbWVudAorICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0CisgICAgICov
CisgICAgX2FwcGVuZFRleHROb2RlOiBmdW5jdGlvbihlbGVtZW50LCB0ZXh0KQorICAgIHsKKyAg
ICAgICAgdmFyIHRleHROb2RlID0gdGhpcy5fY2FjaGVkVGV4dE5vZGVzLnBvcCgpOworICAgICAg
ICBpZiAodGV4dE5vZGUpCisgICAgICAgICAgICB0ZXh0Tm9kZS5ub2RlVmFsdWUgPSB0ZXh0Owor
ICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHRO
b2RlKHRleHQpOworICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRleHROb2RlKTsKKyAgICAg
ICAgaWYgKCEoInRleHROb2RlcyIgaW4gZWxlbWVudCkpCisgICAgICAgICAgICBlbGVtZW50LnRl
eHROb2RlcyA9IFtdOworICAgICAgICBlbGVtZW50LnRleHROb2Rlcy5wdXNoKHRleHROb2RlKTsK
KyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQKKyAgICAg
KiBAcGFyYW0ge2Jvb2xlYW59IGlzRXh0ZXJuYWwKKyAgICAgKi8KKyAgICBfY3JlYXRlTGluazog
ZnVuY3Rpb24oY29udGVudCwgaXNFeHRlcm5hbCkKKyAgICB7CisgICAgICAgIHZhciBxdW90ZSA9
IGNvbnRlbnQuY2hhckF0KDApOworICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPiAxICYmIChx
dW90ZSA9PT0gIlwiIiB8fCAgIHF1b3RlID09PSAiJyIpKQorICAgICAgICAgICAgY29udGVudCA9
IGNvbnRlbnQuc3Vic3RyaW5nKDEsIGNvbnRlbnQubGVuZ3RoIC0gMSk7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHF1b3RlID0gbnVsbDsKKworICAgICAgICB2YXIgYSA9IFdlYkluc3BlY3Rv
ci5saW5raWZ5VVJMQXNOb2RlKHRoaXMuX3Jld3JpdGVIcmVmKGNvbnRlbnQpLCBjb250ZW50LCB1
bmRlZmluZWQsIGlzRXh0ZXJuYWwpOworICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoInNwYW4iKTsKKyAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSAid2Via2l0LWh0bWwt
YXR0cmlidXRlLXZhbHVlIjsKKyAgICAgICAgaWYgKHF1b3RlKQorICAgICAgICAgICAgc3Bhbi5h
cHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShxdW90ZSkpOworICAgICAgICBzcGFu
LmFwcGVuZENoaWxkKGEpOworICAgICAgICBpZiAocXVvdGUpCisgICAgICAgICAgICBzcGFuLmFw
cGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHF1b3RlKSk7CisgICAgICAgIHJldHVy
biBzcGFuOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge3N0cmluZz19IGhyZWZW
YWx1ZQorICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGlzRXh0ZXJuYWwKKyAgICAgKi8KKyAgICBf
cmV3cml0ZUhyZWY6IGZ1bmN0aW9uKGhyZWZWYWx1ZSwgaXNFeHRlcm5hbCkKKyAgICB7CisgICAg
ICAgIGlmICghdGhpcy5fdXJsIHx8ICFocmVmVmFsdWUgfHwgaHJlZlZhbHVlLmluZGV4T2YoIjov
LyIpID4gMCkKKyAgICAgICAgICAgIHJldHVybiBocmVmVmFsdWU7CisgICAgICAgIHJldHVybiBX
ZWJJbnNwZWN0b3IuY29tcGxldGVVUkwodGhpcy5fdXJsLCBocmVmVmFsdWUpOworICAgIH0sCisK
KyAgICBfaGFuZGxlRE9NVXBkYXRlczogZnVuY3Rpb24oZSkKKyAgICB7CisgICAgICAgIGlmICh0
aGlzLl9kb21VcGRhdGVDb2FsZXNjaW5nTGV2ZWwpCisgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0OworICAgICAgICBpZiAodGFyZ2V0ID09PSB0aGlz
Ll9jb250YWluZXIpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFyIGxpbmVSb3cg
PSB0aGlzLl9lbmNsb3NpbmdMaW5lUm93T3JTZWxmKHRhcmdldCk7CisgICAgICAgIGlmICghbGlu
ZVJvdykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobGluZVJvdy5kZWNvcmF0
aW9uc0VsZW1lbnQgJiYgbGluZVJvdy5kZWNvcmF0aW9uc0VsZW1lbnQuaXNTZWxmT3JBbmNlc3Rv
cih0YXJnZXQpKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fc3luY0RlY29yYXRpb25zRm9yTGlu
ZUxpc3RlbmVyKQorICAgICAgICAgICAgICAgIHRoaXMuX3N5bmNEZWNvcmF0aW9uc0ZvckxpbmVM
aXN0ZW5lcihsaW5lUm93LmxpbmVOdW1iZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisKKyAgICAgICAgaWYgKHRoaXMuX3JlYWRPbmx5KQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIGlmICh0YXJnZXQgPT09IGxpbmVSb3cgJiYgZS50eXBlID09PSAiRE9NTm9kZUlu
c2VydGVkIikgeworICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIG5ld2x5IGluc2VydGVk
IGxpbmUgcm93IGhhcyBubyBsaW5lTnVtYmVyLgorICAgICAgICAgICAgZGVsZXRlIGxpbmVSb3cu
bGluZU51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzdGFydExpbmUgPSAwOworICAg
ICAgICBmb3IgKHZhciByb3cgPSBsaW5lUm93OyByb3c7IHJvdyA9IHJvdy5wcmV2aW91c1NpYmxp
bmcpIHsKKyAgICAgICAgICAgIGlmICh0eXBlb2Ygcm93LmxpbmVOdW1iZXIgPT09ICJudW1iZXIi
KSB7CisgICAgICAgICAgICAgICAgc3RhcnRMaW5lID0gcm93LmxpbmVOdW1iZXI7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIg
ZW5kTGluZSA9IHN0YXJ0TGluZSArIDE7CisgICAgICAgIGZvciAodmFyIHJvdyA9IGxpbmVSb3cu
bmV4dFNpYmxpbmc7IHJvdzsgcm93ID0gcm93Lm5leHRTaWJsaW5nKSB7CisgICAgICAgICAgICBp
ZiAodHlwZW9mIHJvdy5saW5lTnVtYmVyID09PSAibnVtYmVyIiAmJiByb3cubGluZU51bWJlciA+
IHN0YXJ0TGluZSkgeworICAgICAgICAgICAgICAgIGVuZExpbmUgPSByb3cubGluZU51bWJlcjsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgIGlmICh0YXJnZXQgPT09IGxpbmVSb3cgJiYgZS50eXBlID09PSAiRE9NTm9kZVJlbW92ZWQi
KSB7CisgICAgICAgICAgICAvLyBOb3cgdGhpcyB3aWxsIG5vIGxvbmdlciBiZSB2YWxpZC4KKyAg
ICAgICAgICAgIGRlbGV0ZSBsaW5lUm93LmxpbmVOdW1iZXI7CisgICAgICAgIH0KKworICAgICAg
ICBpZiAodGhpcy5fZGlydHlMaW5lcykgeworICAgICAgICAgICAgdGhpcy5fZGlydHlMaW5lcy5z
dGFydCA9IE1hdGgubWluKHRoaXMuX2RpcnR5TGluZXMuc3RhcnQsIHN0YXJ0TGluZSk7CisgICAg
ICAgICAgICB0aGlzLl9kaXJ0eUxpbmVzLmVuZCA9IE1hdGgubWF4KHRoaXMuX2RpcnR5TGluZXMu
ZW5kLCBlbmRMaW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuX2RpcnR5
TGluZXMgPSB7IHN0YXJ0OiBzdGFydExpbmUsIGVuZDogZW5kTGluZSB9OworICAgICAgICAgICAg
c2V0VGltZW91dCh0aGlzLl9hcHBseURvbVVwZGF0ZXMuYmluZCh0aGlzKSwgMCk7CisgICAgICAg
ICAgICAvLyBSZW1vdmUgbWFya2VkIHJhbmdlcywgaWYgYW55LgorICAgICAgICAgICAgdGhpcy5t
YXJrQW5kUmV2ZWFsUmFuZ2UobnVsbCk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgX2FwcGx5
RG9tVXBkYXRlczogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLl9kaXJ0eUxp
bmVzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBlZGl0
b3IgaGFkIGJlZW4gc2V0IHJlYWRPbmx5IGJ5IHRoZSBtb21lbnQgd2hlbiB0aGlzIGFzeW5jIGNh
bGxiYWNrIGdvdCBleGVjdXRlZC4KKyAgICAgICAgaWYgKHRoaXMuX3JlYWRPbmx5KSB7CisgICAg
ICAgICAgICBkZWxldGUgdGhpcy5fZGlydHlMaW5lczsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorCisgICAgICAgIHZhciBkaXJ0eUxpbmVzID0gdGhpcy5fZGlydHlMaW5lczsKKwor
ICAgICAgICB2YXIgZmlyc3RDaHVua051bWJlciA9IHRoaXMuX2NodW5rTnVtYmVyRm9yTGluZShk
aXJ0eUxpbmVzLnN0YXJ0KTsKKyAgICAgICAgdmFyIHN0YXJ0TGluZSA9IHRoaXMuX3RleHRDaHVu
a3NbZmlyc3RDaHVua051bWJlcl0uc3RhcnRMaW5lOworICAgICAgICB2YXIgZW5kTGluZSA9IHRo
aXMuX3RleHRNb2RlbC5saW5lc0NvdW50OworCisgICAgICAgIC8vIENvbGxlY3QgbGluZXMuCisg
ICAgICAgIHZhciBmaXJzdExpbmVSb3c7CisgICAgICAgIGlmIChmaXJzdENodW5rTnVtYmVyKSB7
CisgICAgICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtzW2ZpcnN0Q2h1bmtOdW1i
ZXIgLSAxXTsKKyAgICAgICAgICAgIGZpcnN0TGluZVJvdyA9IGNodW5rLmV4cGFuZGVkID8gY2h1
bmsuZ2V0RXhwYW5kZWRMaW5lUm93KGNodW5rLnN0YXJ0TGluZSArIGNodW5rLmxpbmVzQ291bnQg
LSAxKSA6IGNodW5rLmVsZW1lbnQ7CisgICAgICAgICAgICBmaXJzdExpbmVSb3cgPSBmaXJzdExp
bmVSb3cubmV4dFNpYmxpbmc7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZmlyc3RMaW5l
Um93ID0gdGhpcy5fY29udGFpbmVyLmZpcnN0Q2hpbGQ7CisKKyAgICAgICAgdmFyIGxpbmVzID0g
W107CisgICAgICAgIGZvciAodmFyIGxpbmVSb3cgPSBmaXJzdExpbmVSb3c7IGxpbmVSb3c7IGxp
bmVSb3cgPSBsaW5lUm93Lm5leHRTaWJsaW5nKSB7CisgICAgICAgICAgICBpZiAodHlwZW9mIGxp
bmVSb3cubGluZU51bWJlciA9PT0gIm51bWJlciIgJiYgbGluZVJvdy5saW5lTnVtYmVyID49IGRp
cnR5TGluZXMuZW5kKSB7CisgICAgICAgICAgICAgICAgZW5kTGluZSA9IGxpbmVSb3cubGluZU51
bWJlcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IC8vIFVwZGF0ZSB3aXRoIHRoZSBuZXdlc3QgbGluZU51bWJlciwgc28gdGhhdCB0aGUgY2FsbCB0
byB0aGUgX2dldFNlbGVjdGlvbiBtZXRob2QgYmVsb3cgc2hvdWxkIHdvcmsuCisgICAgICAgICAg
ICBsaW5lUm93LmxpbmVOdW1iZXIgPSBzdGFydExpbmUgKyBsaW5lcy5sZW5ndGg7CisgICAgICAg
ICAgICB0aGlzLl9jb2xsZWN0TGluZXNGcm9tRGl2KGxpbmVzLCBsaW5lUm93KTsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIFRyeSB0byBkZWNyZWFzZSB0aGUgcmFuZ2UgYmVpbmcgcmVwbGFjZWQs
IGlmIHBvc3NpYmxlLgorICAgICAgICB2YXIgc3RhcnRPZmZzZXQgPSAwOworICAgICAgICB3aGls
ZSAoc3RhcnRMaW5lIDwgZGlydHlMaW5lcy5zdGFydCAmJiBzdGFydE9mZnNldCA8IGxpbmVzLmxl
bmd0aCkgeworICAgICAgICAgICAgaWYgKHRoaXMuX3RleHRNb2RlbC5saW5lKHN0YXJ0TGluZSkg
IT09IGxpbmVzW3N0YXJ0T2Zmc2V0XSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICsrc3RhcnRPZmZzZXQ7CisgICAgICAgICAgICArK3N0YXJ0TGluZTsKKyAgICAgICAgfQor
CisgICAgICAgIHZhciBlbmRPZmZzZXQgPSBsaW5lcy5sZW5ndGg7CisgICAgICAgIHdoaWxlIChl
bmRMaW5lID4gZGlydHlMaW5lcy5lbmQgJiYgZW5kT2Zmc2V0ID4gc3RhcnRPZmZzZXQpIHsKKyAg
ICAgICAgICAgIGlmICh0aGlzLl90ZXh0TW9kZWwubGluZShlbmRMaW5lIC0gMSkgIT09IGxpbmVz
W2VuZE9mZnNldCAtIDFdKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLS1l
bmRPZmZzZXQ7CisgICAgICAgICAgICAtLWVuZExpbmU7CisgICAgICAgIH0KKworICAgICAgICBs
aW5lcyA9IGxpbmVzLnNsaWNlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOworCisgICAgICAgIC8v
IFRyeSB0byBkZWNyZWFzZSB0aGUgcmFuZ2UgYmVpbmcgcmVwbGFjZWQgYnkgY29sdW1uIG9mZnNl
dHMsIGlmIHBvc3NpYmxlLgorICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSAwOworICAgICAgICB2
YXIgZW5kQ29sdW1uID0gdGhpcy5fdGV4dE1vZGVsLmxpbmVMZW5ndGgoZW5kTGluZSAtIDEpOwor
ICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgdmFyIGxpbmUxID0g
dGhpcy5fdGV4dE1vZGVsLmxpbmUoc3RhcnRMaW5lKTsKKyAgICAgICAgICAgIHZhciBsaW5lMiA9
IGxpbmVzWzBdOworICAgICAgICAgICAgd2hpbGUgKGxpbmUxW3N0YXJ0Q29sdW1uXSAmJiBsaW5l
MVtzdGFydENvbHVtbl0gPT09IGxpbmUyW3N0YXJ0Q29sdW1uXSkKKyAgICAgICAgICAgICAgICAr
K3N0YXJ0Q29sdW1uOworICAgICAgICAgICAgbGluZXNbMF0gPSBsaW5lMi5zdWJzdHJpbmcoc3Rh
cnRDb2x1bW4pOworCisgICAgICAgICAgICBsaW5lMSA9IHRoaXMuX3RleHRNb2RlbC5saW5lKGVu
ZExpbmUgLSAxKTsKKyAgICAgICAgICAgIGxpbmUyID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV07
CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZENvbHVtbiAmJiBpIDwgbGluZTIu
bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRMaW5lID09PSBlbmRMaW5l
IC0gMSAmJiBlbmRDb2x1bW4gLSBpIDw9IHN0YXJ0Q29sdW1uKQorICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobGluZTFbZW5kQ29sdW1uIC0gaSAtIDFdICE9
PSBsaW5lMltsaW5lMi5sZW5ndGggLSBpIC0gMV0pCisgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgICAgICBl
bmRDb2x1bW4gLT0gaTsKKyAgICAgICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9
IGxpbmUyLnN1YnN0cmluZygwLCBsaW5lMi5sZW5ndGggLSBpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorCisgICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWxlY3Rpb24oKTsK
KworICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwICYmIGVuZExpbmUgPCB0aGlzLl90ZXh0
TW9kZWwubGluZXNDb3VudCkKKyAgICAgICAgICAgIHZhciBvbGRSYW5nZSA9IG5ldyBXZWJJbnNw
ZWN0b3IuVGV4dFJhbmdlKHN0YXJ0TGluZSwgMCwgZW5kTGluZSwgMCk7CisgICAgICAgIGVsc2Ug
aWYgKGxpbmVzLmxlbmd0aCA9PT0gMCAmJiBzdGFydExpbmUgPiAwKQorICAgICAgICAgICAgdmFy
IG9sZFJhbmdlID0gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2Uoc3RhcnRMaW5lIC0gMSwgdGhp
cy5fdGV4dE1vZGVsLmxpbmVMZW5ndGgoc3RhcnRMaW5lIC0gMSksIGVuZExpbmUgLSAxLCB0aGlz
Ll90ZXh0TW9kZWwubGluZUxlbmd0aChlbmRMaW5lIC0gMSkpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICB2YXIgb2xkUmFuZ2UgPSBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZShzdGFydExp
bmUsIHN0YXJ0Q29sdW1uLCBlbmRMaW5lIC0gMSwgZW5kQ29sdW1uKTsKKworICAgICAgICB2YXIg
bmV3Q29udGVudCA9IGxpbmVzLmpvaW4oIlxuIik7CisgICAgICAgIGlmICh0aGlzLl90ZXh0TW9k
ZWwuY29weVJhbmdlKG9sZFJhbmdlKSA9PT0gbmV3Q29udGVudCkgeworICAgICAgICAgICAgZGVs
ZXRlIHRoaXMuX2RpcnR5TGluZXM7CisgICAgICAgICAgICByZXR1cm47IC8vIE5vb3AKKyAgICAg
ICAgfQorCisgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDEgJiYgbGluZXNbMF0gPT09ICJ9
IiAmJiBvbGRSYW5nZS5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiAhdGhpcy5f
dGV4dE1vZGVsLmxpbmUob2xkUmFuZ2UuZW5kTGluZSkudHJpbSgpKQorICAgICAgICAgICAgdGhp
cy5fdW5pbmRlbnRBZnRlckJsb2NrKG9sZFJhbmdlLCBzZWxlY3Rpb24pOworICAgICAgICAKKyAg
ICAgICAgLy8gVGhpcyBpcyBhICJmb3JlaWduIiBjYWxsIG91dHNpZGUgb2YgdGhpcyBjbGFzcy4g
U2hvdWxkIGJlIGJlZm9yZSB3ZSBkZWxldGUgdGhlIGRpcnR5IGxpbmVzIGZsYWcuCisgICAgICAg
IHRoaXMuX2VudGVyVGV4dENoYW5nZU1vZGUoKTsKKworICAgICAgICBkZWxldGUgdGhpcy5fZGly
dHlMaW5lczsKKworICAgICAgICB2YXIgbmV3UmFuZ2UgPSB0aGlzLl9lZGl0UmFuZ2Uob2xkUmFu
Z2UsIG5ld0NvbnRlbnQpOworCisgICAgICAgIHRoaXMuX3BhaW50U2NoZWR1bGVkTGluZXModHJ1
ZSk7CisgICAgICAgIHRoaXMuX3Jlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKKworICAgICAg
ICB0aGlzLl9leGl0VGV4dENoYW5nZU1vZGUob2xkUmFuZ2UsIG5ld1JhbmdlKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSBvbGRSYW5n
ZQorICAgICAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRSYW5nZX0gc2VsZWN0aW9uCisgICAg
ICovCisgICAgX3VuaW5kZW50QWZ0ZXJCbG9jazogZnVuY3Rpb24ob2xkUmFuZ2UsIHNlbGVjdGlv
bikKKyAgICB7CisgICAgICAgIHZhciBuZXN0aW5nTGV2ZWwgPSAxOworICAgICAgICBmb3IgKHZh
ciBpID0gb2xkUmFuZ2UuZW5kTGluZTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIHZhciBh
dHRyaWJ1dGUgPSB0aGlzLl90ZXh0TW9kZWwuZ2V0QXR0cmlidXRlKGksICJoaWdobGlnaHQiKTsK
KyAgICAgICAgICAgIGlmICghYXR0cmlidXRlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgdmFyIGNvbHVtbk51bWJlcnMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGUpLnJl
dmVyc2UoKTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29sdW1uTnVtYmVycy5s
ZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBjb2x1bW5OdW1iZXJz
W2pdOworICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVbY29sdW1uXS50b2tlblR5cGUgPT09
ICJibG9jay1zdGFydCIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoLS1uZXN0aW5nTGV2
ZWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGluZUNvbnRlbnQgPSB0aGlzLl90
ZXh0TW9kZWwubGluZShpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9ja09mZnNl
dCA9IGxpbmVDb250ZW50Lmxlbmd0aCAtIGxpbmVDb250ZW50LnRyaW1MZWZ0KCkubGVuZ3RoOwor
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrT2Zmc2V0IDwgb2xkUmFuZ2Uuc3RhcnRD
b2x1bW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRSYW5nZS5zdGFydENvbHVt
biA9IGJsb2NrT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5z
dGFydENvbHVtbiA9IGJsb2NrT2Zmc2V0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzZWxlY3Rpb24uZW5kQ29sdW1uID0gYmxvY2tPZmZzZXQgKyAxOworICAgICAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1
dGVbY29sdW1uXS50b2tlblR5cGUgPT09ICJibG9jay1lbmQiKQorICAgICAgICAgICAgICAgICAg
ICArK25lc3RpbmdMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisKKyAg
ICAvKioKKyAgICAgKiBAcGFyYW0ge1dlYkluc3BlY3Rvci5UZXh0UmFuZ2V9IG9sZFJhbmdlCisg
ICAgICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSBuZXdSYW5nZQorICAgICAqLwor
ICAgIHRleHRDaGFuZ2VkOiBmdW5jdGlvbihvbGRSYW5nZSwgbmV3UmFuZ2UpCisgICAgeworICAg
ICAgICB0aGlzLmJlZ2luRG9tVXBkYXRlcygpOworICAgICAgICB0aGlzLl9yZW1vdmVEZWNvcmF0
aW9uc0luUmFuZ2Uob2xkUmFuZ2UpOworICAgICAgICB0aGlzLl91cGRhdGVDaHVua3NGb3JSYW5n
ZXMob2xkUmFuZ2UsIG5ld1JhbmdlKTsKKyAgICAgICAgdGhpcy5fdXBkYXRlSGlnaGxpZ2h0c0Zv
clJhbmdlKG5ld1JhbmdlKTsKKyAgICAgICAgdGhpcy5lbmREb21VcGRhdGVzKCk7CisgICAgfSwK
KworICAgIC8qKgorICAgICAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRSYW5nZX0gcmFuZ2UK
KyAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dAorICAgICAqLworICAgIF9lZGl0UmFuZ2U6IGZ1
bmN0aW9uKHJhbmdlLCB0ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2xhc3RFZGl0ZWRS
YW5nZSAmJiAoIXRleHQgfHwgdGV4dC5pbmRleE9mKCJcbiIpICE9PSAtMSB8fCB0aGlzLl9sYXN0
RWRpdGVkUmFuZ2UuZW5kTGluZSAhPT0gcmFuZ2Uuc3RhcnRMaW5lIHx8IHRoaXMuX2xhc3RFZGl0
ZWRSYW5nZS5lbmRDb2x1bW4gIT09IHJhbmdlLnN0YXJ0Q29sdW1uKSkKKyAgICAgICAgICAgIHRo
aXMuX3RleHRNb2RlbC5tYXJrVW5kb2FibGVTdGF0ZSgpOworCisgICAgICAgIHZhciBuZXdSYW5n
ZSA9IHRoaXMuX3RleHRNb2RlbC5lZGl0UmFuZ2UocmFuZ2UsIHRleHQpOworICAgICAgICB0aGlz
Ll9sYXN0RWRpdGVkUmFuZ2UgPSBuZXdSYW5nZTsKKworICAgICAgICByZXR1cm4gbmV3UmFuZ2U7
CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRSYW5n
ZX0gcmFuZ2UKKyAgICAgKi8KKyAgICBfcmVtb3ZlRGVjb3JhdGlvbnNJblJhbmdlOiBmdW5jdGlv
bihyYW5nZSkKKyAgICB7CisgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLl9jaHVua051bWJlckZv
ckxpbmUocmFuZ2Uuc3RhcnRMaW5lKTsgaSA8IHRoaXMuX3RleHRDaHVua3MubGVuZ3RoOyArK2kp
IHsKKyAgICAgICAgICAgIHZhciBjaHVuayA9IHRoaXMuX3RleHRDaHVua3NbaV07CisgICAgICAg
ICAgICBpZiAoY2h1bmsuc3RhcnRMaW5lID4gcmFuZ2UuZW5kTGluZSkKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGNodW5rLnJlbW92ZUFsbERlY29yYXRpb25zKCk7CisgICAg
ICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4
dFJhbmdlfSBvbGRSYW5nZQorICAgICAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRSYW5nZX0g
bmV3UmFuZ2UKKyAgICAgKi8KKyAgICBfdXBkYXRlQ2h1bmtzRm9yUmFuZ2VzOiBmdW5jdGlvbihv
bGRSYW5nZSwgbmV3UmFuZ2UpCisgICAgeworICAgICAgICAvLyBVcGRhdGUgdGhlIGNodW5rcyBp
biByYW5nZTogZmlyc3RDaHVua051bWJlciA8PSBpbmRleCA8PSBsYXN0Q2h1bmtOdW1iZXIKKyAg
ICAgICAgdmFyIGZpcnN0Q2h1bmtOdW1iZXIgPSB0aGlzLl9jaHVua051bWJlckZvckxpbmUob2xk
UmFuZ2Uuc3RhcnRMaW5lKTsKKyAgICAgICAgdmFyIGxhc3RDaHVua051bWJlciA9IGZpcnN0Q2h1
bmtOdW1iZXI7CisgICAgICAgIHdoaWxlIChsYXN0Q2h1bmtOdW1iZXIgKyAxIDwgdGhpcy5fdGV4
dENodW5rcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl90ZXh0Q2h1bmtzW2xhc3RD
aHVua051bWJlciArIDFdLnN0YXJ0TGluZSA+IG9sZFJhbmdlLmVuZExpbmUpCisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICArK2xhc3RDaHVua051bWJlcjsKKyAgICAgICAgfQor
CisgICAgICAgIHZhciBzdGFydExpbmUgPSB0aGlzLl90ZXh0Q2h1bmtzW2ZpcnN0Q2h1bmtOdW1i
ZXJdLnN0YXJ0TGluZTsKKyAgICAgICAgdmFyIGxpbmVzQ291bnQgPSB0aGlzLl90ZXh0Q2h1bmtz
W2xhc3RDaHVua051bWJlcl0uc3RhcnRMaW5lICsgdGhpcy5fdGV4dENodW5rc1tsYXN0Q2h1bmtO
dW1iZXJdLmxpbmVzQ291bnQgLSBzdGFydExpbmU7CisgICAgICAgIHZhciBsaW5lc0RpZmYgPSBu
ZXdSYW5nZS5saW5lc0NvdW50IC0gb2xkUmFuZ2UubGluZXNDb3VudDsKKyAgICAgICAgbGluZXND
b3VudCArPSBsaW5lc0RpZmY7CisKKyAgICAgICAgaWYgKGxpbmVzRGlmZikgeworICAgICAgICAg
ICAgLy8gTGluZXMgc2hpZnRlZCwgdXBkYXRlIHRoZSBsaW5lIG51bWJlcnMgb2YgdGhlIGNodW5r
cyBiZWxvdy4KKyAgICAgICAgICAgIGZvciAodmFyIGNodW5rTnVtYmVyID0gbGFzdENodW5rTnVt
YmVyICsgMTsgY2h1bmtOdW1iZXIgPCB0aGlzLl90ZXh0Q2h1bmtzLmxlbmd0aDsgKytjaHVua051
bWJlcikKKyAgICAgICAgICAgICAgICB0aGlzLl90ZXh0Q2h1bmtzW2NodW5rTnVtYmVyXS5zdGFy
dExpbmUgKz0gbGluZXNEaWZmOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGZpcnN0TGluZVJv
dzsKKyAgICAgICAgaWYgKGZpcnN0Q2h1bmtOdW1iZXIpIHsKKyAgICAgICAgICAgIHZhciBjaHVu
ayA9IHRoaXMuX3RleHRDaHVua3NbZmlyc3RDaHVua051bWJlciAtIDFdOworICAgICAgICAgICAg
Zmlyc3RMaW5lUm93ID0gY2h1bmsuZXhwYW5kZWQgPyBjaHVuay5nZXRFeHBhbmRlZExpbmVSb3co
Y2h1bmsuc3RhcnRMaW5lICsgY2h1bmsubGluZXNDb3VudCAtIDEpIDogY2h1bmsuZWxlbWVudDsK
KyAgICAgICAgICAgIGZpcnN0TGluZVJvdyA9IGZpcnN0TGluZVJvdy5uZXh0U2libGluZzsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICBmaXJzdExpbmVSb3cgPSB0aGlzLl9jb250YWluZXIu
Zmlyc3RDaGlsZDsKKworICAgICAgICAvLyBNb3N0IGZyZXF1ZW50IGNhc2U6IGEgY2h1bmsgcmVt
YWluZWQgdGhlIHNhbWUuCisgICAgICAgIGZvciAodmFyIGNodW5rTnVtYmVyID0gZmlyc3RDaHVu
a051bWJlcjsgY2h1bmtOdW1iZXIgPD0gbGFzdENodW5rTnVtYmVyOyArK2NodW5rTnVtYmVyKSB7
CisgICAgICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtzW2NodW5rTnVtYmVyXTsK
KyAgICAgICAgICAgIGlmIChjaHVuay5zdGFydExpbmUgKyBjaHVuay5saW5lc0NvdW50ID4gdGhp
cy5fdGV4dE1vZGVsLmxpbmVzQ291bnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICB2YXIgbGluZU51bWJlciA9IGNodW5rLnN0YXJ0TGluZTsKKyAgICAgICAgICAgIGZvciAo
dmFyIGxpbmVSb3cgPSBmaXJzdExpbmVSb3c7IGxpbmVSb3cgJiYgbGluZU51bWJlciA8IGNodW5r
LnN0YXJ0TGluZSArIGNodW5rLmxpbmVzQ291bnQ7IGxpbmVSb3cgPSBsaW5lUm93Lm5leHRTaWJs
aW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmVSb3cubGluZU51bWJlciAhPT0gbGluZU51
bWJlciB8fCBsaW5lUm93ICE9PSBjaHVuay5nZXRFeHBhbmRlZExpbmVSb3cobGluZU51bWJlcikg
fHwgbGluZVJvdy50ZXh0Q29udGVudCAhPT0gdGhpcy5fdGV4dE1vZGVsLmxpbmUobGluZU51bWJl
cikgfHwgIWxpbmVSb3cuZmlyc3RDaGlsZCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgKytsaW5lTnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
aWYgKGxpbmVOdW1iZXIgPCBjaHVuay5zdGFydExpbmUgKyBjaHVuay5saW5lc0NvdW50KQorICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2h1bmsudXBkYXRlQ29sbGFwc2VkTGlu
ZVJvdygpOworICAgICAgICAgICAgKytmaXJzdENodW5rTnVtYmVyOworICAgICAgICAgICAgZmly
c3RMaW5lUm93ID0gbGluZVJvdzsKKyAgICAgICAgICAgIHN0YXJ0TGluZSArPSBjaHVuay5saW5l
c0NvdW50OworICAgICAgICAgICAgbGluZXNDb3VudCAtPSBjaHVuay5saW5lc0NvdW50OworICAg
ICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0Q2h1bmtOdW1iZXIgPiBsYXN0Q2h1bmtOdW1iZXIg
JiYgbGluZXNDb3VudCA9PT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBN
YXliZSBtZXJnZSB3aXRoIHRoZSBuZXh0IGNodW5rLCBzbyB0aGF0IHdlIHNob3VsZCBub3QgY3Jl
YXRlIDEtc2l6ZWQgY2h1bmtzIHdoZW4gYXBwZW5kaW5nIG5ldyBsaW5lcyBvbmUgYnkgb25lLgor
ICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtzW2xhc3RDaHVua051bWJlciArIDFd
OworICAgICAgICB2YXIgbGluZXNJbkxhc3RDaHVuayA9IGxpbmVzQ291bnQgJSB0aGlzLl9kZWZh
dWx0Q2h1bmtTaXplOworICAgICAgICBpZiAoY2h1bmsgJiYgIWNodW5rLmRlY29yYXRlZCAmJiBs
aW5lc0luTGFzdENodW5rID4gMCAmJiBsaW5lc0luTGFzdENodW5rICsgY2h1bmsubGluZXNDb3Vu
dCA8PSB0aGlzLl9kZWZhdWx0Q2h1bmtTaXplKSB7CisgICAgICAgICAgICArK2xhc3RDaHVua051
bWJlcjsKKyAgICAgICAgICAgIGxpbmVzQ291bnQgKz0gY2h1bmsubGluZXNDb3VudDsKKyAgICAg
ICAgfQorCisgICAgICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wOwor
ICAgICAgICB2YXIgc2Nyb2xsTGVmdCA9IHRoaXMuZWxlbWVudC5zY3JvbGxMZWZ0OworCisgICAg
ICAgIC8vIERlbGV0ZSBhbGwgRE9NIGVsZW1lbnRzIHRoYXQgd2VyZSBlaXRoZXIgY29udHJvbGxl
ZCBieSB0aGUgb2xkIGNodW5rcywgb3IgaGF2ZSBqdXN0IGJlZW4gaW5zZXJ0ZWQuCisgICAgICAg
IHZhciBmaXJzdFVubW9kaWZpZWRMaW5lUm93ID0gbnVsbDsKKyAgICAgICAgY2h1bmsgPSB0aGlz
Ll90ZXh0Q2h1bmtzW2xhc3RDaHVua051bWJlciArIDFdOworICAgICAgICBpZiAoY2h1bmspCisg
ICAgICAgICAgICBmaXJzdFVubW9kaWZpZWRMaW5lUm93ID0gY2h1bmsuZXhwYW5kZWQgPyBjaHVu
ay5nZXRFeHBhbmRlZExpbmVSb3coY2h1bmsuc3RhcnRMaW5lKSA6IGNodW5rLmVsZW1lbnQ7CisK
KyAgICAgICAgd2hpbGUgKGZpcnN0TGluZVJvdyAmJiBmaXJzdExpbmVSb3cgIT09IGZpcnN0VW5t
b2RpZmllZExpbmVSb3cpIHsKKyAgICAgICAgICAgIHZhciBsaW5lUm93ID0gZmlyc3RMaW5lUm93
OworICAgICAgICAgICAgZmlyc3RMaW5lUm93ID0gZmlyc3RMaW5lUm93Lm5leHRTaWJsaW5nOwor
ICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZUNoaWxkKGxpbmVSb3cpOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gUmVwbGFjZSBvbGQgY2h1bmtzIHdpdGggdGhlIG5ldyBvbmVzLgor
ICAgICAgICBmb3IgKHZhciBjaHVua051bWJlciA9IGZpcnN0Q2h1bmtOdW1iZXI7IGxpbmVzQ291
bnQgPiAwOyArK2NodW5rTnVtYmVyKSB7CisgICAgICAgICAgICB2YXIgY2h1bmtMaW5lc0NvdW50
ID0gTWF0aC5taW4odGhpcy5fZGVmYXVsdENodW5rU2l6ZSwgbGluZXNDb3VudCk7CisgICAgICAg
ICAgICB2YXIgbmV3Q2h1bmsgPSB0aGlzLl9jcmVhdGVOZXdDaHVuayhzdGFydExpbmUsIHN0YXJ0
TGluZSArIGNodW5rTGluZXNDb3VudCk7CisgICAgICAgICAgICB0aGlzLl9jb250YWluZXIuaW5z
ZXJ0QmVmb3JlKG5ld0NodW5rLmVsZW1lbnQsIGZpcnN0VW5tb2RpZmllZExpbmVSb3cpOworCisg
ICAgICAgICAgICBpZiAoY2h1bmtOdW1iZXIgPD0gbGFzdENodW5rTnVtYmVyKQorICAgICAgICAg
ICAgICAgIHRoaXMuX3RleHRDaHVua3NbY2h1bmtOdW1iZXJdID0gbmV3Q2h1bms7CisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpcy5fdGV4dENodW5rcy5zcGxpY2UoY2h1bmtO
dW1iZXIsIDAsIG5ld0NodW5rKTsKKyAgICAgICAgICAgIHN0YXJ0TGluZSArPSBjaHVua0xpbmVz
Q291bnQ7CisgICAgICAgICAgICBsaW5lc0NvdW50IC09IGNodW5rTGluZXNDb3VudDsKKyAgICAg
ICAgfQorICAgICAgICBpZiAoY2h1bmtOdW1iZXIgPD0gbGFzdENodW5rTnVtYmVyKQorICAgICAg
ICAgICAgdGhpcy5fdGV4dENodW5rcy5zcGxpY2UoY2h1bmtOdW1iZXIsIGxhc3RDaHVua051bWJl
ciAtIGNodW5rTnVtYmVyICsgMSk7CisKKyAgICAgICAgdGhpcy5lbGVtZW50LnNjcm9sbFRvcCA9
IHNjcm9sbFRvcDsKKyAgICAgICAgdGhpcy5lbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge1dlYkluc3BlY3Rvci5UZXh0UmFu
Z2V9IHJhbmdlCisgICAgICovCisgICAgX3VwZGF0ZUhpZ2hsaWdodHNGb3JSYW5nZTogZnVuY3Rp
b24ocmFuZ2UpCisgICAgeworICAgICAgICB2YXIgdmlzaWJsZUZyb20gPSB0aGlzLmVsZW1lbnQu
c2Nyb2xsVG9wOworICAgICAgICB2YXIgdmlzaWJsZVRvID0gdGhpcy5lbGVtZW50LnNjcm9sbFRv
cCArIHRoaXMuZWxlbWVudC5jbGllbnRIZWlnaHQ7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRo
aXMuX2ZpbmRWaXNpYmxlQ2h1bmtzKHZpc2libGVGcm9tLCB2aXNpYmxlVG8pOworICAgICAgICB2
YXIgY2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtzW3Jlc3VsdC5lbmQgLSAxXTsKKyAgICAgICAgdmFy
IGxhc3RWaXNpYmxlTGluZSA9IGNodW5rLnN0YXJ0TGluZSArIGNodW5rLmxpbmVzQ291bnQ7CisK
KyAgICAgICAgbGFzdFZpc2libGVMaW5lID0gTWF0aC5tYXgobGFzdFZpc2libGVMaW5lLCByYW5n
ZS5lbmRMaW5lICsgMSk7CisgICAgICAgIGxhc3RWaXNpYmxlTGluZSA9IE1hdGgubWluKGxhc3RW
aXNpYmxlTGluZSwgdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQpOworCisgICAgICAgIHZhciB1
cGRhdGVkID0gdGhpcy5faGlnaGxpZ2h0ZXIudXBkYXRlSGlnaGxpZ2h0KHJhbmdlLnN0YXJ0TGlu
ZSwgbGFzdFZpc2libGVMaW5lKTsKKyAgICAgICAgaWYgKCF1cGRhdGVkKSB7CisgICAgICAgICAg
ICAvLyBIaWdobGlnaHRzIGZvciB0aGUgY2h1bmtzIGJlbG93IGFyZSBpbnZhbGlkLCBzbyBqdXN0
IGNvbGxhcHNlIHRoZW0uCisgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5fY2h1bmtOdW1i
ZXJGb3JMaW5lKHJhbmdlLnN0YXJ0TGluZSk7IGkgPCB0aGlzLl90ZXh0Q2h1bmtzLmxlbmd0aDsg
KytpKQorICAgICAgICAgICAgICAgIHRoaXMuX3RleHRDaHVua3NbaV0uZXhwYW5kZWQgPSBmYWxz
ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX3JlcGFpbnRBbGwoKTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gbGluZXMKKyAgICAgKiBAcGFy
YW0ge0VsZW1lbnR9IGVsZW1lbnQKKyAgICAgKi8KKyAgICBfY29sbGVjdExpbmVzRnJvbURpdjog
ZnVuY3Rpb24obGluZXMsIGVsZW1lbnQpCisgICAgeworICAgICAgICB2YXIgdGV4dENvbnRlbnRz
ID0gW107CisgICAgICAgIHZhciBub2RlID0gZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhU
X05PREUgPyBlbGVtZW50IDogZWxlbWVudC50cmF2ZXJzZU5leHROb2RlKGVsZW1lbnQpOworICAg
ICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGVjb3JhdGlvbnNF
bGVtZW50ID09PSBub2RlKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxp
bmc7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiYnIiKQorICAgICAgICAgICAg
ICAgIHRleHRDb250ZW50cy5wdXNoKCJcbiIpOworICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5u
b2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpCisgICAgICAgICAgICAgICAgdGV4dENvbnRlbnRz
LnB1c2gobm9kZS50ZXh0Q29udGVudCk7CisgICAgICAgICAgICBub2RlID0gbm9kZS50cmF2ZXJz
ZU5leHROb2RlKGVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRleHRDb250ZW50
ID0gdGV4dENvbnRlbnRzLmpvaW4oIiIpOworICAgICAgICAvLyBUaGUgbGFzdCBcbiAoaWYgYW55
KSBkb2VzIG5vdCAiY291bnQiIGluIGEgRElWLgorICAgICAgICB0ZXh0Q29udGVudCA9IHRleHRD
b250ZW50LnJlcGxhY2UoL1xuJC8sICIiKTsKKworICAgICAgICB0ZXh0Q29udGVudHMgPSB0ZXh0
Q29udGVudC5zcGxpdCgiXG4iKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Q29u
dGVudHMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBsaW5lcy5wdXNoKHRleHRDb250ZW50c1tp
XSk7CisgICAgfQorfQorCitXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5QYW5lbC5wcm90b3R5
cGUuX19wcm90b19fID0gV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2VkUGFuZWwucHJvdG90
eXBlOworCisvKioKKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4
dEVkaXRvckNodW5rZWRQYW5lbH0gY2h1bmtlZFBhbmVsCisgKiBAcGFyYW0ge251bWJlcn0gc3Rh
cnRMaW5lCisgKiBAcGFyYW0ge251bWJlcn0gZW5kTGluZQorKi8KK1dlYkluc3BlY3Rvci5UZXh0
RWRpdG9yTWFpbkNodW5rID0gZnVuY3Rpb24oY2h1bmtlZFBhbmVsLCBzdGFydExpbmUsIGVuZExp
bmUpCit7CisgICAgdGhpcy5fY2h1bmtlZFBhbmVsID0gY2h1bmtlZFBhbmVsOworICAgIHRoaXMu
X3RleHRNb2RlbCA9IGNodW5rZWRQYW5lbC5fdGV4dE1vZGVsOworCisgICAgdGhpcy5lbGVtZW50
ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgdGhpcy5lbGVtZW50LmxpbmVO
dW1iZXIgPSBzdGFydExpbmU7CisgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9ICJ3ZWJraXQt
bGluZS1jb250ZW50IjsKKyAgICB0aGlzLl9jaHVua2VkUGFuZWwuX2VuYWJsZURPTU5vZGVSZW1v
dmVkTGlzdGVuZXIodGhpcy5lbGVtZW50LCB0cnVlKTsKKworICAgIHRoaXMuX3N0YXJ0TGluZSA9
IHN0YXJ0TGluZTsKKyAgICBlbmRMaW5lID0gTWF0aC5taW4odGhpcy5fdGV4dE1vZGVsLmxpbmVz
Q291bnQsIGVuZExpbmUpOworICAgIHRoaXMubGluZXNDb3VudCA9IGVuZExpbmUgLSBzdGFydExp
bmU7CisKKyAgICB0aGlzLl9leHBhbmRlZCA9IGZhbHNlOworICAgIHRoaXMuX3JlYWRPbmx5ID0g
ZmFsc2U7CisKKyAgICB0aGlzLnVwZGF0ZUNvbGxhcHNlZExpbmVSb3coKTsKK30KKworV2ViSW5z
cGVjdG9yLlRleHRFZGl0b3JNYWluQ2h1bmsucHJvdG90eXBlID0geworICAgIGFkZERlY29yYXRp
b246IGZ1bmN0aW9uKGRlY29yYXRpb24pCisgICAgeworICAgICAgICB0aGlzLl9jaHVua2VkUGFu
ZWwuYmVnaW5Eb21VcGRhdGVzKCk7CisgICAgICAgIGlmICh0eXBlb2YgZGVjb3JhdGlvbiA9PT0g
InN0cmluZyIpCisgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkU3R5bGVDbGFzcyhkZWNvcmF0
aW9uKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoIXRoaXMuZWxlbWVudC5kZWNv
cmF0aW9uc0VsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGVjb3JhdGlv
bnNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICAgICAgICAg
ICAgdGhpcy5lbGVtZW50LmRlY29yYXRpb25zRWxlbWVudC5jbGFzc05hbWUgPSAid2Via2l0LWxp
bmUtZGVjb3JhdGlvbnMiOworICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGls
ZCh0aGlzLmVsZW1lbnQuZGVjb3JhdGlvbnNFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIHRoaXMuZWxlbWVudC5kZWNvcmF0aW9uc0VsZW1lbnQuYXBwZW5kQ2hpbGQoZGVjb3Jh
dGlvbik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5fY2h1bmtlZFBhbmVsLmVuZERvbVVwZGF0
ZXMoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0g
ZGVjb3JhdGlvbgorICAgICAqLworICAgIHJlbW92ZURlY29yYXRpb246IGZ1bmN0aW9uKGRlY29y
YXRpb24pCisgICAgeworICAgICAgICB0aGlzLl9jaHVua2VkUGFuZWwuYmVnaW5Eb21VcGRhdGVz
KCk7CisgICAgICAgIGlmICh0eXBlb2YgZGVjb3JhdGlvbiA9PT0gInN0cmluZyIpCisgICAgICAg
ICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlU3R5bGVDbGFzcyhkZWNvcmF0aW9uKTsKKyAgICAgICAg
ZWxzZSBpZiAodGhpcy5lbGVtZW50LmRlY29yYXRpb25zRWxlbWVudCkKKyAgICAgICAgICAgIHRo
aXMuZWxlbWVudC5kZWNvcmF0aW9uc0VsZW1lbnQucmVtb3ZlQ2hpbGQoZGVjb3JhdGlvbik7Cisg
ICAgICAgIHRoaXMuX2NodW5rZWRQYW5lbC5lbmREb21VcGRhdGVzKCk7CisgICAgfSwKKworICAg
IHJlbW92ZUFsbERlY29yYXRpb25zOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9j
aHVua2VkUGFuZWwuYmVnaW5Eb21VcGRhdGVzKCk7CisgICAgICAgIHRoaXMuZWxlbWVudC5jbGFz
c05hbWUgPSAid2Via2l0LWxpbmUtY29udGVudCI7CisgICAgICAgIGlmICh0aGlzLmVsZW1lbnQu
ZGVjb3JhdGlvbnNFbGVtZW50KSB7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2hp
bGQodGhpcy5lbGVtZW50LmRlY29yYXRpb25zRWxlbWVudCk7CisgICAgICAgICAgICBkZWxldGUg
dGhpcy5lbGVtZW50LmRlY29yYXRpb25zRWxlbWVudDsKKyAgICAgICAgfQorICAgICAgICB0aGlz
Ll9jaHVua2VkUGFuZWwuZW5kRG9tVXBkYXRlcygpOworICAgIH0sCisKKyAgICAvKioKKyAgICAg
KiBAcmV0dXJuIHtib29sZWFufQorICAgICAqLworICAgIGdldCBkZWNvcmF0ZWQoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgIT09ICJ3ZWJraXQtbGluZS1j
b250ZW50IiB8fCAhISh0aGlzLmVsZW1lbnQuZGVjb3JhdGlvbnNFbGVtZW50ICYmIHRoaXMuZWxl
bWVudC5kZWNvcmF0aW9uc0VsZW1lbnQuZmlyc3RDaGlsZCk7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAqIEByZXR1cm4ge251bWJlcn0KKyAgICAgKi8KKyAgICBnZXQgc3RhcnRMaW5lKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLl9zdGFydExpbmU7CisgICAgfSwKKworICAgIHNldCBz
dGFydExpbmUoc3RhcnRMaW5lKQorICAgIHsKKyAgICAgICAgdGhpcy5fc3RhcnRMaW5lID0gc3Rh
cnRMaW5lOworICAgICAgICB0aGlzLmVsZW1lbnQubGluZU51bWJlciA9IHN0YXJ0TGluZTsKKyAg
ICAgICAgaWYgKHRoaXMuX2V4cGFuZGVkTGluZVJvd3MpIHsKKyAgICAgICAgICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgdGhpcy5fZXhwYW5kZWRMaW5lUm93cy5sZW5ndGg7ICsraSkKKyAgICAgICAg
ICAgICAgICB0aGlzLl9leHBhbmRlZExpbmVSb3dzW2ldLmxpbmVOdW1iZXIgPSBzdGFydExpbmUg
KyBpOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge2Jvb2xl
YW59CisgICAgICovCisgICAgZ2V0IGV4cGFuZGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLl9leHBhbmRlZDsKKyAgICB9LAorCisgICAgc2V0IGV4cGFuZGVkKGV4cGFuZGVkKQorICAg
IHsKKyAgICAgICAgaWYgKHRoaXMuX2V4cGFuZGVkID09PSBleHBhbmRlZCkKKyAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICB0aGlzLl9leHBhbmRlZCA9IGV4cGFuZGVkOworCisgICAgICAg
IGlmICh0aGlzLmxpbmVzQ291bnQgPT09IDEpIHsKKyAgICAgICAgICAgIGlmIChleHBhbmRlZCkK
KyAgICAgICAgICAgICAgICB0aGlzLl9jaHVua2VkUGFuZWwuX3BhaW50TGluZSh0aGlzLmVsZW1l
bnQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fY2h1
bmtlZFBhbmVsLmJlZ2luRG9tVXBkYXRlcygpOworCisgICAgICAgIGlmIChleHBhbmRlZCkgewor
ICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWRMaW5lUm93cyA9IFtdOworICAgICAgICAgICAgdmFy
IHBhcmVudEVsZW1lbnQgPSB0aGlzLmVsZW1lbnQucGFyZW50RWxlbWVudDsKKyAgICAgICAgICAg
IGZvciAodmFyIGkgPSB0aGlzLnN0YXJ0TGluZTsgaSA8IHRoaXMuc3RhcnRMaW5lICsgdGhpcy5s
aW5lc0NvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICB2YXIgbGluZVJvdyA9IHRoaXMuX2Ny
ZWF0ZVJvdyhpKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9jaHVua2VkUGFuZWwuX2VuYWJsZURP
TU5vZGVSZW1vdmVkTGlzdGVuZXIobGluZVJvdywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgdGhp
cy5fdXBkYXRlRWxlbWVudFJlYWRPbmx5U3RhdGUobGluZVJvdyk7CisgICAgICAgICAgICAgICAg
cGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUobGluZVJvdywgdGhpcy5lbGVtZW50KTsKKyAgICAg
ICAgICAgICAgICB0aGlzLl9leHBhbmRlZExpbmVSb3dzLnB1c2gobGluZVJvdyk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICB0aGlzLl9jaHVua2VkUGFuZWwuX2VuYWJsZURPTU5vZGVSZW1v
dmVkTGlzdGVuZXIodGhpcy5lbGVtZW50LCBmYWxzZSk7CisgICAgICAgICAgICBwYXJlbnRFbGVt
ZW50LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7CisgICAgICAgICAgICB0aGlzLl9jaHVua2Vk
UGFuZWwuX3BhaW50TGluZXModGhpcy5zdGFydExpbmUsIHRoaXMuc3RhcnRMaW5lICsgdGhpcy5s
aW5lc0NvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50SW5z
ZXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZXhw
YW5kZWRMaW5lUm93cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHZhciBsaW5lUm93
ID0gdGhpcy5fZXhwYW5kZWRMaW5lUm93c1tpXTsKKyAgICAgICAgICAgICAgICB0aGlzLl9jaHVu
a2VkUGFuZWwuX2VuYWJsZURPTU5vZGVSZW1vdmVkTGlzdGVuZXIobGluZVJvdywgZmFsc2UpOwor
ICAgICAgICAgICAgICAgIHZhciBwYXJlbnRFbGVtZW50ID0gbGluZVJvdy5wYXJlbnRFbGVtZW50
OworICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50KSB7CisgICAgICAgICAgICAgICAg
ICAgIGlmICghZWxlbWVudEluc2VydGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVt
ZW50SW5zZXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtl
ZFBhbmVsLl9lbmFibGVET01Ob2RlUmVtb3ZlZExpc3RlbmVyKHRoaXMuZWxlbWVudCwgdHJ1ZSk7
CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlz
LmVsZW1lbnQsIGxpbmVSb3cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgIHBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQobGluZVJvdyk7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIHRoaXMuX2NodW5rZWRQYW5lbC5fcmVsZWFzZUxpbmVzSGln
aGxpZ2h0KGxpbmVSb3cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRlIHRoaXMu
X2V4cGFuZGVkTGluZVJvd3M7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9jaHVua2VkUGFu
ZWwuZW5kRG9tVXBkYXRlcygpOworICAgIH0sCisKKyAgICBzZXQgcmVhZE9ubHkocmVhZE9ubHkp
CisgICAgeworICAgICAgICBpZiAodGhpcy5fcmVhZE9ubHkgPT09IHJlYWRPbmx5KQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIHRoaXMuX3JlYWRPbmx5ID0gcmVhZE9ubHk7CisgICAg
ICAgIHRoaXMuX3VwZGF0ZUVsZW1lbnRSZWFkT25seVN0YXRlKHRoaXMuZWxlbWVudCk7CisgICAg
ICAgIGlmICh0aGlzLl9leHBhbmRlZExpbmVSb3dzKSB7CisgICAgICAgICAgICBmb3IgKHZhciBp
ID0gMDsgaSA8IHRoaXMuX2V4cGFuZGVkTGluZVJvd3MubGVuZ3RoOyArK2kpCisgICAgICAgICAg
ICAgICAgdGhpcy5fdXBkYXRlRWxlbWVudFJlYWRPbmx5U3RhdGUodGhpcy5fZXhwYW5kZWRMaW5l
Um93c1tpXSk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogQHJldHVybiB7
Ym9vbGVhbn0KKyAgICAgKi8KKyAgICBnZXQgcmVhZE9ubHkoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuX3JlYWRPbmx5OworICAgIH0sCisKKyAgICBfdXBkYXRlRWxlbWVudFJlYWRPbmx5
U3RhdGU6IGZ1bmN0aW9uKGVsZW1lbnQpCisgICAgeworICAgICAgICBpZiAodGhpcy5fcmVhZE9u
bHkpCisgICAgICAgICAgICBlbGVtZW50LmFkZFN0eWxlQ2xhc3MoInRleHQtZWRpdG9yLXJlYWQt
b25seSIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlbGVtZW50LnJlbW92ZVN0eWxlQ2xh
c3MoInRleHQtZWRpdG9yLXJlYWQtb25seSIpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBA
cmV0dXJuIHtudW1iZXJ9CisgICAgICovCisgICAgZ2V0IGhlaWdodCgpCisgICAgeworICAgICAg
ICBpZiAoIXRoaXMuX2V4cGFuZGVkTGluZVJvd3MpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5f
Y2h1bmtlZFBhbmVsLl90b3RhbEhlaWdodCh0aGlzLmVsZW1lbnQpOworICAgICAgICByZXR1cm4g
dGhpcy5fY2h1bmtlZFBhbmVsLl90b3RhbEhlaWdodCh0aGlzLl9leHBhbmRlZExpbmVSb3dzWzBd
LCB0aGlzLl9leHBhbmRlZExpbmVSb3dzW3RoaXMuX2V4cGFuZGVkTGluZVJvd3MubGVuZ3RoIC0g
MV0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtudW1iZXJ9CisgICAgICov
CisgICAgZ2V0IG9mZnNldFRvcCgpCisgICAgeworICAgICAgICByZXR1cm4gKHRoaXMuX2V4cGFu
ZGVkTGluZVJvd3MgJiYgdGhpcy5fZXhwYW5kZWRMaW5lUm93cy5sZW5ndGgpID8gdGhpcy5fZXhw
YW5kZWRMaW5lUm93c1swXS5vZmZzZXRUb3AgOiB0aGlzLmVsZW1lbnQub2Zmc2V0VG9wOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU51bWJlcgorICAgICAq
IEByZXR1cm4ge0VsZW1lbnR9CisgICAgICovCisgICAgX2NyZWF0ZVJvdzogZnVuY3Rpb24obGlu
ZU51bWJlcikKKyAgICB7CisgICAgICAgIHZhciBsaW5lUm93ID0gdGhpcy5fY2h1bmtlZFBhbmVs
Ll9jYWNoZWRSb3dzLnBvcCgpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAg
ICAgICBsaW5lUm93LmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOworICAgICAgICBsaW5lUm93LmNs
YXNzTmFtZSA9ICJ3ZWJraXQtbGluZS1jb250ZW50IjsKKyAgICAgICAgbGluZVJvdy50ZXh0Q29u
dGVudCA9IHRoaXMuX3RleHRNb2RlbC5saW5lKGxpbmVOdW1iZXIpOworICAgICAgICBpZiAoIWxp
bmVSb3cudGV4dENvbnRlbnQpCisgICAgICAgICAgICBsaW5lUm93LmFwcGVuZENoaWxkKGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpOworICAgICAgICByZXR1cm4gbGluZVJvdzsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIKKyAgICAgKiBA
cmV0dXJuIHtFbGVtZW50fQorICAgICAqLworICAgIGdldEV4cGFuZGVkTGluZVJvdzogZnVuY3Rp
b24obGluZU51bWJlcikKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5fZXhwYW5kZWQgfHwgbGlu
ZU51bWJlciA8IHRoaXMuc3RhcnRMaW5lIHx8IGxpbmVOdW1iZXIgPj0gdGhpcy5zdGFydExpbmUg
KyB0aGlzLmxpbmVzQ291bnQpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYg
KCF0aGlzLl9leHBhbmRlZExpbmVSb3dzKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVu
dDsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuZGVkTGluZVJvd3NbbGluZU51bWJlciAtIHRo
aXMuc3RhcnRMaW5lXTsKKyAgICB9LAorCisgICAgdXBkYXRlQ29sbGFwc2VkTGluZVJvdzogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMubGluZXNDb3VudCA9PT0gMSAmJiB0aGlz
Ll9leHBhbmRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2YXIgbGluZXMgPSBb
XTsKKyAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuc3RhcnRMaW5lOyBpIDwgdGhpcy5zdGFydExp
bmUgKyB0aGlzLmxpbmVzQ291bnQ7ICsraSkKKyAgICAgICAgICAgIGxpbmVzLnB1c2godGhpcy5f
dGV4dE1vZGVsLmxpbmUoaSkpOworCisgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZHJl
bigpOworICAgICAgICB0aGlzLmVsZW1lbnQudGV4dENvbnRlbnQgPSBsaW5lcy5qb2luKCJcbiIp
OworCisgICAgICAgIC8vIFRoZSBsYXN0IGVtcHR5IGxpbmUgd2lsbCBnZXQgc3dhbGxvd2VkIG90
aGVyd2lzZS4KKyAgICAgICAgaWYgKCFsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSkKKyAgICAgICAg
ICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIp
KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQt
ZW5kL1NvdXJjZUZyYW1lLmpzIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9T
b3VyY2VGcmFtZS5qcwppbmRleCA2ZDE4MTllOTFmYmUwODVhNmY5NGIyZjE0NzM4NTI3NDJlMDQ3
NDEyLi4yNzU4OWM3MGM4ZGRhYmUwYTFjMzcyMjdjNmIyNWE4ODg4NGE2MDQyIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1NvdXJjZUZyYW1lLmpzCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvU291cmNlRnJhbWUuanMKQEAgLTQy
LDcgKzQyLDcgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUZyYW1lID0gZnVuY3Rpb24oY29udGVudFBy
b3ZpZGVyKQogICAgIHRoaXMuX2NvbnRlbnRQcm92aWRlciA9IGNvbnRlbnRQcm92aWRlcjsKIAog
ICAgIHZhciB0ZXh0RWRpdG9yRGVsZWdhdGUgPSBuZXcgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JE
ZWxlZ2F0ZUZvclNvdXJjZUZyYW1lKHRoaXMpOwotICAgIHRoaXMuX3RleHRFZGl0b3IgPSBuZXcg
V2ViSW5zcGVjdG9yLlRleHRFZGl0b3IodGhpcy5fdXJsLCB0ZXh0RWRpdG9yRGVsZWdhdGUpOwor
ICAgIHRoaXMuX3RleHRFZGl0b3IgPSBuZXcgV2ViSW5zcGVjdG9yLkRlZmF1bHRUZXh0RWRpdG9y
KHRoaXMuX3VybCwgdGV4dEVkaXRvckRlbGVnYXRlKTsKIAogICAgIHRoaXMuX2N1cnJlbnRTZWFy
Y2hSZXN1bHRJbmRleCA9IC0xOwogICAgIHRoaXMuX3NlYXJjaFJlc3VsdHMgPSBbXTsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvci5qcyBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvci5qcwppbmRleCAw
YjAyOGMzM2MyZGMzNTkzZGViMzdlOTA0OWExYzIyMDAzNTI0NzVkLi5mNjhlOWI2YzVmNzg5NTQ5
YmMyMzBkYjU4Yjk5ZWJlMDUzYjU0YmE0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNw
ZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3IuanMKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVj
dG9yL2Zyb250LWVuZC9UZXh0RWRpdG9yLmpzCkBAIC0zMCw0OTkgKzMwLDE1NyBAQAogICovCiAK
IC8qKgotICogQGV4dGVuZHMge1dlYkluc3BlY3Rvci5WaWV3fQotICogQGNvbnN0cnVjdG9yCi0g
KiBAcGFyYW0gez9zdHJpbmd9IHVybAotICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4dEVkaXRv
ckRlbGVnYXRlfSBkZWxlZ2F0ZQorICogQGludGVyZmFjZQogICovCi1XZWJJbnNwZWN0b3IuVGV4
dEVkaXRvciA9IGZ1bmN0aW9uKHVybCwgZGVsZWdhdGUpCi17Ci0gICAgV2ViSW5zcGVjdG9yLlZp
ZXcuY2FsbCh0aGlzKTsKLSAgICB0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoInRleHRFZGl0b3Iu
Y3NzIik7Ci0KLSAgICB0aGlzLl90ZXh0TW9kZWwgPSBuZXcgV2ViSW5zcGVjdG9yLlRleHRFZGl0
b3JNb2RlbCgpOwotICAgIHRoaXMuX3RleHRNb2RlbC5hZGRFdmVudExpc3RlbmVyKFdlYkluc3Bl
Y3Rvci5UZXh0RWRpdG9yTW9kZWwuRXZlbnRzLlRleHRDaGFuZ2VkLCB0aGlzLl90ZXh0Q2hhbmdl
ZCwgdGhpcyk7Ci0gICAgdGhpcy5fdGV4dE1vZGVsLnJlc2V0VW5kb1N0YWNrKCk7Ci0gICAgdGhp
cy5fZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgICB0aGlzLl91cmwgPSB1cmw7Ci0gICAgdGhpcy5l
bGVtZW50LmNsYXNzTmFtZSA9ICJ0ZXh0LWVkaXRvciBtb25vc3BhY2UiOwotCi0gICAgdmFyIGVu
dGVyVGV4dENoYW5nZU1vZGUgPSB0aGlzLl9lbnRlckludGVybmFsVGV4dENoYW5nZU1vZGUuYmlu
ZCh0aGlzKTsKLSAgICB2YXIgZXhpdFRleHRDaGFuZ2VNb2RlID0gdGhpcy5fZXhpdEludGVybmFs
VGV4dENoYW5nZU1vZGUuYmluZCh0aGlzKTsKLSAgICB2YXIgc3luY1Njcm9sbExpc3RlbmVyID0g
dGhpcy5fc3luY1Njcm9sbC5iaW5kKHRoaXMpOwotICAgIHZhciBzeW5jRGVjb3JhdGlvbnNGb3JM
aW5lTGlzdGVuZXIgPSB0aGlzLl9zeW5jRGVjb3JhdGlvbnNGb3JMaW5lLmJpbmQodGhpcyk7Ci0g
ICAgdmFyIHN5bmNMaW5lSGVpZ2h0TGlzdGVuZXIgPSB0aGlzLl9zeW5jTGluZUhlaWdodC5iaW5k
KHRoaXMpOwotICAgIHRoaXMuX21haW5QYW5lbCA9IG5ldyBXZWJJbnNwZWN0b3IuVGV4dEVkaXRv
ck1haW5QYW5lbCh0aGlzLl90ZXh0TW9kZWwsIHVybCwgc3luY1Njcm9sbExpc3RlbmVyLCBzeW5j
RGVjb3JhdGlvbnNGb3JMaW5lTGlzdGVuZXIsIGVudGVyVGV4dENoYW5nZU1vZGUsIGV4aXRUZXh0
Q2hhbmdlTW9kZSk7Ci0gICAgdGhpcy5fZ3V0dGVyUGFuZWwgPSBuZXcgV2ViSW5zcGVjdG9yLlRl
eHRFZGl0b3JHdXR0ZXJQYW5lbCh0aGlzLl90ZXh0TW9kZWwsIHN5bmNEZWNvcmF0aW9uc0Zvckxp
bmVMaXN0ZW5lciwgc3luY0xpbmVIZWlnaHRMaXN0ZW5lcik7Ci0KLSAgICB0aGlzLl9tYWluUGFu
ZWwuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCB0aGlzLl9oYW5kbGVTY3JvbGxD
aGFuZ2VkLmJpbmQodGhpcyksIGZhbHNlKTsKLSAgICB0aGlzLl9tYWluUGFuZWwuX2NvbnRhaW5l
ci5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsIHRoaXMuX2hhbmRsZUZvY3VzZWQuYmluZCh0aGlz
KSwgZmFsc2UpOwotCi0gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX21haW5QYW5l
bC5lbGVtZW50KTsKLSAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZ3V0dGVyUGFu
ZWwuZWxlbWVudCk7Ci0KLSAgICAvLyBGb3J3YXJkIG1vdXNlIHdoZWVsIGV2ZW50cyBmcm9tIHRo
ZSB1bnNjcm9sbGFibGUgZ3V0dGVyIHRvIHRoZSBtYWluIHBhbmVsLgotICAgIGZ1bmN0aW9uIGZv
cndhcmRXaGVlbEV2ZW50KGV2ZW50KQotICAgIHsKLSAgICAgICAgdmFyIGNsb25lID0gZG9jdW1l
bnQuY3JlYXRlRXZlbnQoIldoZWVsRXZlbnQiKTsKLSAgICAgICAgY2xvbmUuaW5pdFdlYktpdFdo
ZWVsRXZlbnQoZXZlbnQud2hlZWxEZWx0YVgsIGV2ZW50LndoZWVsRGVsdGFZLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC52aWV3LAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBldmVudC5zY3JlZW5YLCBldmVudC5zY3JlZW5ZLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jdHJsS2V5LCBldmVudC5h
bHRLZXksIGV2ZW50LnNoaWZ0S2V5LCBldmVudC5tZXRhS2V5KTsKLSAgICAgICAgdGhpcy5fbWFp
blBhbmVsLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChjbG9uZSk7Ci0gICAgfQotICAgIHRoaXMuX2d1
dHRlclBhbmVsLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsIGZvcndhcmRX
aGVlbEV2ZW50LmJpbmQodGhpcyksIGZhbHNlKTsKLQotICAgIHRoaXMuZWxlbWVudC5hZGRFdmVu
dExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5faGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpLCBmYWxz
ZSk7Ci0gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgdGhp
cy5fY29udGV4dE1lbnUuYmluZCh0aGlzKSwgdHJ1ZSk7Ci0KLSAgICB0aGlzLl9yZWdpc3RlclNo
b3J0Y3V0cygpOwotfQorV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IgPSBmdW5jdGlvbigpIHsgfTsK
IAogV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlID0geworCiAgICAgLyoqCiAgICAg
ICogQHBhcmFtIHtzdHJpbmd9IG1pbWVUeXBlCiAgICAgICovCi0gICAgc2V0IG1pbWVUeXBlKG1p
bWVUeXBlKQotICAgIHsKLSAgICAgICAgdGhpcy5fbWFpblBhbmVsLm1pbWVUeXBlID0gbWltZVR5
cGU7Ci0gICAgfSwKKyAgICBzZXQgbWltZVR5cGUobWltZVR5cGUpIHsgfSwKIAogICAgIC8qKgog
ICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVhZE9ubHkKICAgICAgKi8KLSAgICBzZXRSZWFkT25s
eTogZnVuY3Rpb24ocmVhZE9ubHkpCi0gICAgewotICAgICAgICBpZiAodGhpcy5fbWFpblBhbmVs
LnJlYWRPbmx5KCkgPT09IHJlYWRPbmx5KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0
aGlzLl9tYWluUGFuZWwuc2V0UmVhZE9ubHkocmVhZE9ubHksIHRoaXMuaXNTaG93aW5nKCkpOwot
ICAgICAgICBXZWJJbnNwZWN0b3IubWFya0JlaW5nRWRpdGVkKHRoaXMuZWxlbWVudCwgIXJlYWRP
bmx5KTsKLSAgICB9LAorICAgIHNldFJlYWRPbmx5OiBmdW5jdGlvbihyZWFkT25seSkgeyB9LAog
CiAgICAgLyoqCiAgICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAgKi8KLSAgICByZWFkT25s
eTogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuX21haW5QYW5lbC5yZWFk
T25seSgpOwotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHtXZWJJbnNwZWN0b3Iu
VGV4dEVkaXRvck1vZGVsfQotICAgICAqLwotICAgIGdldCB0ZXh0TW9kZWwoKQotICAgIHsKLSAg
ICAgICAgcmV0dXJuIHRoaXMuX3RleHRNb2RlbDsKLSAgICB9LAorICAgIHJlYWRPbmx5OiBmdW5j
dGlvbigpIHsgfSwKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICAgICov
Ci0gICAgZGVmYXVsdEZvY3VzZWRFbGVtZW50OiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICBy
ZXR1cm4gdGhpcy5fbWFpblBhbmVsLmRlZmF1bHRGb2N1c2VkRWxlbWVudCgpOwotICAgIH0sCisg
ICAgZGVmYXVsdEZvY3VzZWRFbGVtZW50OiBmdW5jdGlvbigpIHsgfSwKIAogICAgIC8qKgogICAg
ICAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lTnVtYmVyCiAgICAgICovCi0gICAgcmV2ZWFsTGluZTog
ZnVuY3Rpb24obGluZU51bWJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMuX21haW5QYW5lbC5yZXZl
YWxMaW5lKGxpbmVOdW1iZXIpOwotICAgIH0sCisgICAgcmV2ZWFsTGluZTogZnVuY3Rpb24obGlu
ZU51bWJlcikgeyB9LAogCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1i
ZXIKICAgICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSBkZWNvcmF0aW9uCiAgICAgICovCi0g
ICAgYWRkRGVjb3JhdGlvbjogZnVuY3Rpb24obGluZU51bWJlciwgZGVjb3JhdGlvbikKLSAgICB7
Ci0gICAgICAgIHRoaXMuX21haW5QYW5lbC5hZGREZWNvcmF0aW9uKGxpbmVOdW1iZXIsIGRlY29y
YXRpb24pOwotICAgICAgICB0aGlzLl9ndXR0ZXJQYW5lbC5hZGREZWNvcmF0aW9uKGxpbmVOdW1i
ZXIsIGRlY29yYXRpb24pOwotICAgIH0sCisgICAgYWRkRGVjb3JhdGlvbjogZnVuY3Rpb24obGlu
ZU51bWJlciwgZGVjb3JhdGlvbikgeyB9LAogCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHtudW1i
ZXJ9IGxpbmVOdW1iZXIKICAgICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSBkZWNvcmF0aW9u
CiAgICAgICovCi0gICAgcmVtb3ZlRGVjb3JhdGlvbjogZnVuY3Rpb24obGluZU51bWJlciwgZGVj
b3JhdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuX21haW5QYW5lbC5yZW1vdmVEZWNvcmF0aW9u
KGxpbmVOdW1iZXIsIGRlY29yYXRpb24pOwotICAgICAgICB0aGlzLl9ndXR0ZXJQYW5lbC5yZW1v
dmVEZWNvcmF0aW9uKGxpbmVOdW1iZXIsIGRlY29yYXRpb24pOwotICAgIH0sCisgICAgcmVtb3Zl
RGVjb3JhdGlvbjogZnVuY3Rpb24obGluZU51bWJlciwgZGVjb3JhdGlvbikgeyB9LAogCiAgICAg
LyoqCiAgICAgICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSByYW5nZQogICAgICAq
LwotICAgIG1hcmtBbmRSZXZlYWxSYW5nZTogZnVuY3Rpb24ocmFuZ2UpCi0gICAgewotICAgICAg
ICBpZiAocmFuZ2UpCi0gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihyYW5nZSk7Ci0gICAg
ICAgIHRoaXMuX21haW5QYW5lbC5tYXJrQW5kUmV2ZWFsUmFuZ2UocmFuZ2UpOwotICAgIH0sCisg
ICAgbWFya0FuZFJldmVhbFJhbmdlOiBmdW5jdGlvbihyYW5nZSkgeyB9LAogCiAgICAgLyoqCiAg
ICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIKICAgICAgKi8KLSAgICBoaWdobGlnaHRM
aW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyKQotICAgIHsKLSAgICAgICAgaWYgKHR5cGVvZiBsaW5l
TnVtYmVyICE9PSAibnVtYmVyIiB8fCBsaW5lTnVtYmVyIDwgMCkKLSAgICAgICAgICAgIHJldHVy
bjsKKyAgICBoaWdobGlnaHRMaW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyKSB7IH0sCiAKLSAgICAg
ICAgbGluZU51bWJlciA9IE1hdGgubWluKGxpbmVOdW1iZXIsIHRoaXMuX3RleHRNb2RlbC5saW5l
c0NvdW50IC0gMSk7Ci0gICAgICAgIHRoaXMuX21haW5QYW5lbC5oaWdobGlnaHRMaW5lKGxpbmVO
dW1iZXIpOwotICAgIH0sCisgICAgY2xlYXJMaW5lSGlnaGxpZ2h0OiBmdW5jdGlvbigpIHsgfSwK
IAotICAgIGNsZWFyTGluZUhpZ2hsaWdodDogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdGhp
cy5fbWFpblBhbmVsLmNsZWFyTGluZUhpZ2hsaWdodCgpOwotICAgIH0sCi0KLSAgICBmcmVlQ2Fj
aGVkRWxlbWVudHM6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX21haW5QYW5lbC5m
cmVlQ2FjaGVkRWxlbWVudHMoKTsKLSAgICAgICAgdGhpcy5fZ3V0dGVyUGFuZWwuZnJlZUNhY2hl
ZEVsZW1lbnRzKCk7Ci0gICAgfSwKKyAgICBmcmVlQ2FjaGVkRWxlbWVudHM6IGZ1bmN0aW9uKCkg
eyB9LAogCiAgICAgLyoqCiAgICAgICogQHJldHVybiB7QXJyYXkuPEVsZW1lbnQ+fQogICAgICAq
LwotICAgIGVsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yOiBmdW5jdGlvbigpCi0g
ICAgewotICAgICAgICByZXR1cm4gW3RoaXMuX21haW5QYW5lbC5lbGVtZW50XTsKLSAgICB9LAor
ICAgIGVsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yOiBmdW5jdGlvbigpIHsgfSwK
IAogICAgIC8qKgogICAgICAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRFZGl0b3J9IHRleHRF
ZGl0b3IKICAgICAgKi8KLSAgICBpbmhlcml0U2Nyb2xsUG9zaXRpb25zOiBmdW5jdGlvbih0ZXh0
RWRpdG9yKQotICAgIHsKLSAgICAgICAgdGhpcy5fbWFpblBhbmVsLmVsZW1lbnQuX3Njcm9sbFRv
cCA9IHRleHRFZGl0b3IuX21haW5QYW5lbC5lbGVtZW50LnNjcm9sbFRvcDsKLSAgICAgICAgdGhp
cy5fbWFpblBhbmVsLmVsZW1lbnQuX3Njcm9sbExlZnQgPSB0ZXh0RWRpdG9yLl9tYWluUGFuZWwu
ZWxlbWVudC5zY3JvbGxMZWZ0OwotICAgIH0sCi0KLSAgICBiZWdpblVwZGF0ZXM6IGZ1bmN0aW9u
KCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX21haW5QYW5lbC5iZWdpblVwZGF0ZXMoKTsKLSAgICAg
ICAgdGhpcy5fZ3V0dGVyUGFuZWwuYmVnaW5VcGRhdGVzKCk7Ci0gICAgfSwKKyAgICBpbmhlcml0
U2Nyb2xsUG9zaXRpb25zOiBmdW5jdGlvbih0ZXh0RWRpdG9yKSB7IH0sCiAKLSAgICBlbmRVcGRh
dGVzOiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICB0aGlzLl9tYWluUGFuZWwuZW5kVXBkYXRl
cygpOwotICAgICAgICB0aGlzLl9ndXR0ZXJQYW5lbC5lbmRVcGRhdGVzKCk7Ci0gICAgICAgIHRo
aXMuX3VwZGF0ZVBhbmVsT2Zmc2V0cygpOwotICAgIH0sCisgICAgYmVnaW5VcGRhdGVzOiBmdW5j
dGlvbigpIHsgfSwKIAotICAgIG9uUmVzaXplOiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICB0
aGlzLl9tYWluUGFuZWwucmVzaXplKCk7Ci0gICAgICAgIHRoaXMuX2d1dHRlclBhbmVsLnJlc2l6
ZSgpOwotICAgICAgICB0aGlzLl91cGRhdGVQYW5lbE9mZnNldHMoKTsKLSAgICB9LAorICAgIGVu
ZFVwZGF0ZXM6IGZ1bmN0aW9uKCkgeyB9LAogCi0gICAgX3RleHRDaGFuZ2VkOiBmdW5jdGlvbihl
dmVudCkKLSAgICB7Ci0gICAgICAgIGlmICghdGhpcy5faW50ZXJuYWxUZXh0Q2hhbmdlTW9kZSkK
LSAgICAgICAgICAgIHRoaXMuX3RleHRNb2RlbC5yZXNldFVuZG9TdGFjaygpOwotICAgICAgICB0
aGlzLl9tYWluUGFuZWwudGV4dENoYW5nZWQoZXZlbnQuZGF0YS5vbGRSYW5nZSwgZXZlbnQuZGF0
YS5uZXdSYW5nZSk7Ci0gICAgICAgIHRoaXMuX2d1dHRlclBhbmVsLnRleHRDaGFuZ2VkKGV2ZW50
LmRhdGEub2xkUmFuZ2UsIGV2ZW50LmRhdGEubmV3UmFuZ2UpOwotICAgICAgICB0aGlzLl91cGRh
dGVQYW5lbE9mZnNldHMoKTsKLSAgICB9LAorICAgIG9uUmVzaXplOiBmdW5jdGlvbigpIHsgfSwK
IAogICAgIC8qKgogICAgICAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRSYW5nZX0gcmFuZ2UK
ICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dAogICAgICAqIEByZXR1cm4ge1dlYkluc3BlY3Rv
ci5UZXh0UmFuZ2V9CiAgICAgICovCi0gICAgZWRpdFJhbmdlOiBmdW5jdGlvbihyYW5nZSwgdGV4
dCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2VudGVySW50ZXJuYWxUZXh0Q2hhbmdlTW9kZSgpOwot
ICAgICAgICB0aGlzLl90ZXh0TW9kZWwubWFya1VuZG9hYmxlU3RhdGUoKTsKLSAgICAgICAgdmFy
IG5ld1JhbmdlID0gdGhpcy5fdGV4dE1vZGVsLmVkaXRSYW5nZShyYW5nZSwgdGV4dCk7Ci0gICAg
ICAgIHRoaXMuX2V4aXRJbnRlcm5hbFRleHRDaGFuZ2VNb2RlKHJhbmdlLCBuZXdSYW5nZSk7Ci0g
ICAgICAgIHJldHVybiBuZXdSYW5nZTsKLSAgICB9LAotCi0gICAgX2VudGVySW50ZXJuYWxUZXh0
Q2hhbmdlTW9kZTogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdGhpcy5faW50ZXJuYWxUZXh0
Q2hhbmdlTW9kZSA9IHRydWU7Ci0gICAgICAgIHRoaXMuX2RlbGVnYXRlLmJlZm9yZVRleHRDaGFu
Z2VkKCk7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRl
eHRSYW5nZX0gb2xkUmFuZ2UKLSAgICAgKiBAcGFyYW0ge1dlYkluc3BlY3Rvci5UZXh0UmFuZ2V9
IG5ld1JhbmdlCi0gICAgICovCi0gICAgX2V4aXRJbnRlcm5hbFRleHRDaGFuZ2VNb2RlOiBmdW5j
dGlvbihvbGRSYW5nZSwgbmV3UmFuZ2UpCi0gICAgewotICAgICAgICB0aGlzLl9pbnRlcm5hbFRl
eHRDaGFuZ2VNb2RlID0gZmFsc2U7Ci0gICAgICAgIHRoaXMuX2RlbGVnYXRlLmFmdGVyVGV4dENo
YW5nZWQob2xkUmFuZ2UsIG5ld1JhbmdlKTsKLSAgICB9LAotCi0gICAgX3VwZGF0ZVBhbmVsT2Zm
c2V0czogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdmFyIGxpbmVOdW1iZXJzV2lkdGggPSB0
aGlzLl9ndXR0ZXJQYW5lbC5lbGVtZW50Lm9mZnNldFdpZHRoOwotICAgICAgICBpZiAobGluZU51
bWJlcnNXaWR0aCkKLSAgICAgICAgICAgIHRoaXMuX21haW5QYW5lbC5lbGVtZW50LnN0eWxlLnNl
dFByb3BlcnR5KCJsZWZ0IiwgKGxpbmVOdW1iZXJzV2lkdGggKyAyKSArICJweCIpOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICB0aGlzLl9tYWluUGFuZWwuZWxlbWVudC5zdHlsZS5yZW1vdmVQ
cm9wZXJ0eSgibGVmdCIpOyAvLyBVc2UgZGVmYXVsdCB2YWx1ZSBzZXQgaW4gQ1NTLgotICAgIH0s
Ci0KLSAgICBfc3luY1Njcm9sbDogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdmFyIG1haW5F
bGVtZW50ID0gdGhpcy5fbWFpblBhbmVsLmVsZW1lbnQ7Ci0gICAgICAgIHZhciBndXR0ZXJFbGVt
ZW50ID0gdGhpcy5fZ3V0dGVyUGFuZWwuZWxlbWVudDsKLSAgICAgICAgLy8gSGFuZGxlIGhvcml6
b250YWwgc2Nyb2xsIGJhciBhdCB0aGUgYm90dG9tIG9mIHRoZSBtYWluIHBhbmVsLgotICAgICAg
ICB0aGlzLl9ndXR0ZXJQYW5lbC5zeW5jQ2xpZW50SGVpZ2h0KG1haW5FbGVtZW50LmNsaWVudEhl
aWdodCk7Ci0gICAgICAgIGd1dHRlckVsZW1lbnQuc2Nyb2xsVG9wID0gbWFpbkVsZW1lbnQuc2Ny
b2xsVG9wOwotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU51
bWJlcgotICAgICAqLwotICAgIF9zeW5jRGVjb3JhdGlvbnNGb3JMaW5lOiBmdW5jdGlvbihsaW5l
TnVtYmVyKQotICAgIHsKLSAgICAgICAgaWYgKGxpbmVOdW1iZXIgPj0gdGhpcy5fdGV4dE1vZGVs
LmxpbmVzQ291bnQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgdmFyIG1haW5DaHVu
ayA9IHRoaXMuX21haW5QYW5lbC5jaHVua0ZvckxpbmUobGluZU51bWJlcik7Ci0gICAgICAgIGlm
IChtYWluQ2h1bmsubGluZXNDb3VudCA9PT0gMSAmJiBtYWluQ2h1bmsuZGVjb3JhdGVkKSB7Ci0g
ICAgICAgICAgICB2YXIgZ3V0dGVyQ2h1bmsgPSB0aGlzLl9ndXR0ZXJQYW5lbC5tYWtlTGluZUFD
aHVuayhsaW5lTnVtYmVyKTsKLSAgICAgICAgICAgIHZhciBoZWlnaHQgPSBtYWluQ2h1bmsuaGVp
Z2h0OwotICAgICAgICAgICAgaWYgKGhlaWdodCkKLSAgICAgICAgICAgICAgICBndXR0ZXJDaHVu
ay5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCJoZWlnaHQiLCBoZWlnaHQgKyAicHgiKTsKLSAg
ICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBndXR0ZXJDaHVuay5lbGVtZW50LnN0eWxl
LnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
IHZhciBndXR0ZXJDaHVuayA9IHRoaXMuX2d1dHRlclBhbmVsLmNodW5rRm9yTGluZShsaW5lTnVt
YmVyKTsKLSAgICAgICAgICAgIGlmIChndXR0ZXJDaHVuay5saW5lc0NvdW50ID09PSAxKQotICAg
ICAgICAgICAgICAgIGd1dHRlckNodW5rLmVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoImhl
aWdodCIpOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7RWxl
bWVudH0gZ3V0dGVyUm93Ci0gICAgICovCi0gICAgX3N5bmNMaW5lSGVpZ2h0OiBmdW5jdGlvbihn
dXR0ZXJSb3cpCi0gICAgewotICAgICAgICBpZiAodGhpcy5fbGluZUhlaWdodFN5bmNlZCkKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKGd1dHRlclJvdyAmJiBndXR0ZXJSb3cub2Zm
c2V0SGVpZ2h0KSB7Ci0gICAgICAgICAgICAvLyBGb3JjZSBlcXVhbCBsaW5lIGhlaWdodHMgZm9y
IHRoZSBjaGlsZCBwYW5lbHMuCi0gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJv
cGVydHkoImxpbmUtaGVpZ2h0IiwgZ3V0dGVyUm93Lm9mZnNldEhlaWdodCArICJweCIpOwotICAg
ICAgICAgICAgdGhpcy5fbGluZUhlaWdodFN5bmNlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9
LAotCi0gICAgX3JlZ2lzdGVyU2hvcnRjdXRzOiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICB2
YXIga2V5cyA9IFdlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0LktleXM7Ci0gICAgICAgIHZh
ciBtb2RpZmllcnMgPSBXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnM7Ci0K
LSAgICAgICAgdGhpcy5fc2hvcnRjdXRzID0ge307Ci0gICAgICAgIHZhciBjb21taXRFZGl0aW5n
ID0gdGhpcy5fY29tbWl0RWRpdGluZy5iaW5kKHRoaXMpOwotICAgICAgICB0aGlzLl9zaG9ydGN1
dHNbV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleSgicyIsIG1vZGlmaWVycy5D
dHJsT3JNZXRhKV0gPSBjb21taXRFZGl0aW5nOwotCi0gICAgICAgIHZhciBoYW5kbGVFbnRlcktl
eSA9IHRoaXMuX21haW5QYW5lbC5oYW5kbGVFbnRlcktleS5iaW5kKHRoaXMuX21haW5QYW5lbCk7
Ci0gICAgICAgIHRoaXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5t
YWtlS2V5KGtleXMuRW50ZXIuY29kZSwgV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQuTW9k
aWZpZXJzLk5vbmUpXSA9IGhhbmRsZUVudGVyS2V5OwotCi0gICAgICAgIHZhciBoYW5kbGVVbmRv
ID0gdGhpcy5fbWFpblBhbmVsLmhhbmRsZVVuZG9SZWRvLmJpbmQodGhpcy5fbWFpblBhbmVsLCBm
YWxzZSk7Ci0gICAgICAgIHZhciBoYW5kbGVSZWRvID0gdGhpcy5fbWFpblBhbmVsLmhhbmRsZVVu
ZG9SZWRvLmJpbmQodGhpcy5fbWFpblBhbmVsLCB0cnVlKTsKLSAgICAgICAgdGhpcy5fc2hvcnRj
dXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoInoiLCBtb2RpZmllcnMu
Q3RybE9yTWV0YSldID0gaGFuZGxlVW5kbzsKLSAgICAgICAgdGhpcy5fc2hvcnRjdXRzW1dlYklu
c3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoInoiLCBtb2RpZmllcnMuU2hpZnQgfCBt
b2RpZmllcnMuQ3RybE9yTWV0YSldID0gaGFuZGxlUmVkbzsKLQotICAgICAgICB2YXIgaGFuZGxl
VGFiS2V5ID0gdGhpcy5fbWFpblBhbmVsLmhhbmRsZVRhYktleVByZXNzLmJpbmQodGhpcy5fbWFp
blBhbmVsLCBmYWxzZSk7Ci0gICAgICAgIHZhciBoYW5kbGVTaGlmdFRhYktleSA9IHRoaXMuX21h
aW5QYW5lbC5oYW5kbGVUYWJLZXlQcmVzcy5iaW5kKHRoaXMuX21haW5QYW5lbCwgdHJ1ZSk7Ci0g
ICAgICAgIHRoaXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtl
S2V5KGtleXMuVGFiLmNvZGUpXSA9IGhhbmRsZVRhYktleTsKLSAgICAgICAgdGhpcy5fc2hvcnRj
dXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoa2V5cy5UYWIuY29kZSwg
bW9kaWZpZXJzLlNoaWZ0KV0gPSBoYW5kbGVTaGlmdFRhYktleTsKLSAgICB9LAotCi0gICAgX2hh
bmRsZUtleURvd246IGZ1bmN0aW9uKGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5yZWFkT25s
eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHZhciBzaG9ydGN1dEtleSA9IFdl
Ykluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXlGcm9tRXZlbnQoZSk7Ci0gICAgICAg
IHZhciBoYW5kbGVyID0gdGhpcy5fc2hvcnRjdXRzW3Nob3J0Y3V0S2V5XTsKLSAgICAgICAgaWYg
KGhhbmRsZXIgJiYgaGFuZGxlcigpKQotICAgICAgICAgICAgZS5jb25zdW1lKHRydWUpOwotICAg
IH0sCi0KLSAgICBfY29udGV4dE1lbnU6IGZ1bmN0aW9uKGV2ZW50KQotICAgIHsKLSAgICAgICAg
dmFyIGNvbnRleHRNZW51ID0gbmV3IFdlYkluc3BlY3Rvci5Db250ZXh0TWVudSgpOwotICAgICAg
ICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3Mo
IndlYmtpdC1saW5lLW51bWJlciIpOwotICAgICAgICBpZiAodGFyZ2V0KQotICAgICAgICAgICAg
dGhpcy5fZGVsZWdhdGUucG9wdWxhdGVMaW5lR3V0dGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUs
IHRhcmdldC5saW5lTnVtYmVyKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0YXJnZXQg
PSB0aGlzLl9tYWluUGFuZWwuX2VuY2xvc2luZ0xpbmVSb3dPclNlbGYoZXZlbnQudGFyZ2V0KTsK
LSAgICAgICAgICAgIHRoaXMuX2RlbGVnYXRlLnBvcHVsYXRlVGV4dEFyZWFDb250ZXh0TWVudShj
b250ZXh0TWVudSwgdGFyZ2V0ICYmIHRhcmdldC5saW5lTnVtYmVyKTsKLSAgICAgICAgfQotICAg
ICAgICBjb250ZXh0TWVudS5zaG93KGV2ZW50KTsKLSAgICB9LAotCi0gICAgX2NvbW1pdEVkaXRp
bmc6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnJlYWRPbmx5KCkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgdGhpcy5fZGVsZWdhdGUuY29tbWl0RWRp
dGluZygpOwotICAgICAgICBpZiAodGhpcy5fdXJsICYmIFdlYkluc3BlY3Rvci5maWxlTWFuYWdl
ci5pc1VSTFNhdmVkKHRoaXMuX3VybCkpCi0gICAgICAgICAgICBXZWJJbnNwZWN0b3IuZmlsZU1h
bmFnZXIuc2F2ZSh0aGlzLl91cmwsIHRoaXMuX3RleHRNb2RlbC50ZXh0KCksIGZhbHNlKTsKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSwKLQotICAgIF9oYW5kbGVTY3JvbGxDaGFuZ2VkOiBm
dW5jdGlvbihldmVudCkKLSAgICB7Ci0gICAgICAgIHZhciB2aXNpYmxlRnJvbSA9IHRoaXMuX21h
aW5QYW5lbC5lbGVtZW50LnNjcm9sbFRvcDsKLSAgICAgICAgdmFyIGZpcnN0VmlzaWJsZUxpbmVO
dW1iZXIgPSB0aGlzLl9tYWluUGFuZWwuX2ZpbmRGaXJzdFZpc2libGVMaW5lTnVtYmVyKHZpc2li
bGVGcm9tKTsKLSAgICAgICAgdGhpcy5fZGVsZWdhdGUuc2Nyb2xsQ2hhbmdlZChmaXJzdFZpc2li
bGVMaW5lTnVtYmVyKTsKLSAgICB9LAorICAgIGVkaXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UsIHRl
eHQpIHsgfSwKIAogICAgIC8qKgogICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lTnVtYmVyCiAg
ICAgICovCi0gICAgc2Nyb2xsVG9MaW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyKQotICAgIHsKLSAg
ICAgICAgdGhpcy5fbWFpblBhbmVsLnNjcm9sbFRvTGluZShsaW5lTnVtYmVyKTsKLSAgICB9LAot
Ci0gICAgX2hhbmRsZVNlbGVjdGlvbkNoYW5nZTogZnVuY3Rpb24oZXZlbnQpCi0gICAgewotICAg
ICAgICB2YXIgdGV4dFJhbmdlID0gdGhpcy5fbWFpblBhbmVsLl9nZXRTZWxlY3Rpb24oKTsKLSAg
ICAgICAgaWYgKHRleHRSYW5nZSkgewotICAgICAgICAgICAgLy8gV2UgZG8gbm90IHJlc3RvcmUg
c2VsZWN0aW9uIGFmdGVyIGZvY3VzIGxvc3QgdG8gYXZvaWQgc2VsZWN0aW9uIGJsaW5raW5nLiBX
ZSByZXN0b3JlIG9ubHkgY3Vyc29yIHBvc2l0aW9uIGluc3RlYWQuCi0gICAgICAgICAgICAvLyBG
SVhNRTogY29uc2lkZXIgYWRkaW5nIHNlbGVjdGlvbiBkZWNvcmF0aW9uIHRvIGJsdXJyZWQgZWRp
dG9yLgotICAgICAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGlvbiA9IFdlYkluc3BlY3Rvci5UZXh0
UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKHRleHRSYW5nZS5lbmRMaW5lLCB0ZXh0UmFuZ2UuZW5k
Q29sdW1uKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5zZWxlY3Rpb25DaGFu
Z2VkKHRleHRSYW5nZSk7Ci0gICAgfSwKKyAgICBzY3JvbGxUb0xpbmU6IGZ1bmN0aW9uKGxpbmVO
dW1iZXIpIHsgfSwKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4ge1dlYkluc3BlY3Rvci5UZXh0
UmFuZ2V9CiAgICAgICovCi0gICAgc2VsZWN0aW9uOiBmdW5jdGlvbih0ZXh0UmFuZ2UpCi0gICAg
ewotICAgICAgICByZXR1cm4gdGhpcy5fbWFpblBhbmVsLl9nZXRTZWxlY3Rpb24oKTsKLSAgICB9
LAorICAgIHNlbGVjdGlvbjogZnVuY3Rpb24odGV4dFJhbmdlKSB7IH0sCiAKICAgICAvKioKICAg
ICAgKiBAcmV0dXJuIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlP30KICAgICAgKi8KLSAgICBsYXN0
U2VsZWN0aW9uOiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFNl
bGVjdGlvbjsKLSAgICB9LAorICAgIGxhc3RTZWxlY3Rpb246IGZ1bmN0aW9uKCkgeyB9LAogCiAg
ICAgLyoqCiAgICAgICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSB0ZXh0UmFuZ2UK
ICAgICAgKi8KLSAgICBzZXRTZWxlY3Rpb246IGZ1bmN0aW9uKHRleHRSYW5nZSkKLSAgICB7Ci0g
ICAgICAgIHRoaXMuX2xhc3RTZWxlY3Rpb24gPSB0ZXh0UmFuZ2U7Ci0gICAgICAgIGlmICh0aGlz
LmVsZW1lbnQuaXNBbmNlc3Rvcihkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkKLSAgICAgICAgICAg
IHRoaXMuX21haW5QYW5lbC5fcmVzdG9yZVNlbGVjdGlvbih0ZXh0UmFuZ2UpOwotICAgIH0sCisg
ICAgc2V0U2VsZWN0aW9uOiBmdW5jdGlvbih0ZXh0UmFuZ2UpIHsgfSwKIAogICAgIC8qKgogICAg
ICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IAogICAgICAqLwotICAgIHNldFRleHQ6IGZ1bmN0aW9u
KHRleHQpCi0gICAgewotICAgICAgICB0aGlzLl90ZXh0TW9kZWwuc2V0VGV4dCh0ZXh0KTsKLSAg
ICB9LAorICAgIHNldFRleHQ6IGZ1bmN0aW9uKHRleHQpIHsgfSwKIAogICAgIC8qKgogICAgICAq
IEByZXR1cm4ge3N0cmluZ30KICAgICAgKi8KLSAgICB0ZXh0OiBmdW5jdGlvbigpCi0gICAgewot
ICAgICAgICByZXR1cm4gdGhpcy5fdGV4dE1vZGVsLnRleHQoKTsKLSAgICB9LAorICAgIHRleHQ6
IGZ1bmN0aW9uKCkgeyB9LAogCiAgICAgLyoqCiAgICAgICogQHJldHVybiB7V2ViSW5zcGVjdG9y
LlRleHRSYW5nZX0KICAgICAgKi8KLSAgICByYW5nZTogZnVuY3Rpb24oKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIHRoaXMuX3RleHRNb2RlbC5yYW5nZSgpOwotICAgIH0sCisgICAgcmFuZ2U6IGZ1
bmN0aW9uKCkgeyB9LAogCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1i
ZXIKICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgICovCi0gICAgbGluZTogZnVuY3Rpb24o
bGluZU51bWJlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLl90ZXh0TW9kZWwubGluZShs
aW5lTnVtYmVyKTsKLSAgICB9LAorICAgIGxpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpIHsgfSwK
IAogICAgIC8qKgogICAgICAqIEByZXR1cm4ge251bWJlcn0KICAgICAgKi8KLSAgICBnZXQgbGlu
ZXNDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291
bnQ7Ci0gICAgfSwKKyAgICBnZXQgbGluZXNDb3VudCgpIHsgfSwKIAogICAgIC8qKgogICAgICAq
IEBwYXJhbSB7bnVtYmVyfSBsaW5lCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgIAogICAg
ICAqIEBwYXJhbSB7T2JqZWN0P30gdmFsdWUgIAogICAgICAqLwotICAgIHNldEF0dHJpYnV0ZTog
ZnVuY3Rpb24obGluZSwgbmFtZSwgdmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLl90ZXh0TW9k
ZWwuc2V0QXR0cmlidXRlKGxpbmUsIG5hbWUsIHZhbHVlKTsKLSAgICB9LAorICAgIHNldEF0dHJp
YnV0ZTogZnVuY3Rpb24obGluZSwgbmFtZSwgdmFsdWUpIHsgfSwKIAogICAgIC8qKgogICAgICAq
IEBwYXJhbSB7bnVtYmVyfSBsaW5lCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgIAogICAg
ICAqIEByZXR1cm4ge09iamVjdHxudWxsfSB2YWx1ZSAgCiAgICAgICovCi0gICAgZ2V0QXR0cmli
dXRlOiBmdW5jdGlvbihsaW5lLCBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuX3Rl
eHRNb2RlbC5nZXRBdHRyaWJ1dGUobGluZSwgbmFtZSk7Ci0gICAgfSwKKyAgICBnZXRBdHRyaWJ1
dGU6IGZ1bmN0aW9uKGxpbmUsIG5hbWUpIHsgfSwKIAogICAgIC8qKgogICAgICAqIEBwYXJhbSB7
bnVtYmVyfSBsaW5lCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUKICAgICAgKi8KLSAgICBy
ZW1vdmVBdHRyaWJ1dGU6IGZ1bmN0aW9uKGxpbmUsIG5hbWUpCi0gICAgewotICAgICAgICB0aGlz
Ll90ZXh0TW9kZWwucmVtb3ZlQXR0cmlidXRlKGxpbmUsIG5hbWUpOwotICAgIH0sCisgICAgcmVt
b3ZlQXR0cmlidXRlOiBmdW5jdGlvbihsaW5lLCBuYW1lKSB7IH0sCiAKLSAgICB3YXNTaG93bjog
ZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgaWYgKCF0aGlzLnJlYWRPbmx5KCkpCi0gICAgICAg
ICAgICBXZWJJbnNwZWN0b3IubWFya0JlaW5nRWRpdGVkKHRoaXMuZWxlbWVudCwgdHJ1ZSk7Cisg
ICAgd2FzU2hvd246IGZ1bmN0aW9uKCkgeyB9LAogCi0gICAgICAgIHRoaXMuX2JvdW5kU2VsZWN0
aW9uQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLl9oYW5kbGVTZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlz
KTsKLSAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIiwg
dGhpcy5fYm91bmRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciwgZmFsc2UpOwotICAgIH0sCi0KLSAg
ICBfaGFuZGxlRm9jdXNlZDogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuX2xh
c3RTZWxlY3Rpb24pCi0gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbih0aGlzLl9sYXN0U2Vs
ZWN0aW9uKTsKLSAgICB9LAotCi0gICAgd2lsbEhpZGU6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAg
ICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsIHRoaXMu
X2JvdW5kU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIsIGZhbHNlKTsKLSAgICAgICAgZGVsZXRlIHRo
aXMuX2JvdW5kU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLSAgICAgICAgaWYgKCF0aGlzLnJl
YWRPbmx5KCkpCi0gICAgICAgICAgICBXZWJJbnNwZWN0b3IubWFya0JlaW5nRWRpdGVkKHRoaXMu
ZWxlbWVudCwgZmFsc2UpOwotICAgIH0KKyAgICB3aWxsSGlkZTogZnVuY3Rpb24oKSB7IH0KIH0K
IAotV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlLl9fcHJvdG9fXyA9IFdlYkluc3Bl
Y3Rvci5WaWV3LnByb3RvdHlwZTsKLQogLyoqCiAgKiBAaW50ZXJmYWNlCiAgKi8KQEAgLTU2NCwy
MjAyICsyMjIsMyBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckRlbGVnYXRlLnByb3RvdHlwZSA9
IHsKICAgICBwb3B1bGF0ZVRleHRBcmVhQ29udGV4dE1lbnU6IGZ1bmN0aW9uKGNvbnRleHRNZW51
LCBsaW5lTnVtYmVyKSB7IH0KIH0KIAotLyoqCi0gKiBAY29uc3RydWN0b3IKLSAqIEBwYXJhbSB7
V2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbH0gdGV4dE1vZGVsCi0gKi8KLVdlYkluc3BlY3Rv
ci5UZXh0RWRpdG9yQ2h1bmtlZFBhbmVsID0gZnVuY3Rpb24odGV4dE1vZGVsKQotewotICAgIHRo
aXMuX3RleHRNb2RlbCA9IHRleHRNb2RlbDsKLQotICAgIHRoaXMuX2RlZmF1bHRDaHVua1NpemUg
PSA1MDsKLSAgICB0aGlzLl9wYWludENvYWxlc2NpbmdMZXZlbCA9IDA7Ci0gICAgdGhpcy5fZG9t
VXBkYXRlQ29hbGVzY2luZ0xldmVsID0gMDsKLX0KLQotV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JD
aHVua2VkUGFuZWwucHJvdG90eXBlID0gewotICAgIC8qKgotICAgICAqIEByZXR1cm4ge1dlYklu
c3BlY3Rvci5UZXh0RWRpdG9yTW9kZWx9Ci0gICAgICovCi0gICAgZ2V0IHRleHRNb2RlbCgpCi0g
ICAgewotICAgICAgICByZXR1cm4gdGhpcy5fdGV4dE1vZGVsOwotICAgIH0sCi0KLSAgICAvKioK
LSAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU51bWJlcgotICAgICAqLwotICAgIHNjcm9sbFRv
TGluZTogZnVuY3Rpb24obGluZU51bWJlcikKLSAgICB7Ci0gICAgICAgIGlmIChsaW5lTnVtYmVy
ID49IHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50KQotICAgICAgICAgICAgcmV0dXJuOwotCi0g
ICAgICAgIHZhciBjaHVuayA9IHRoaXMubWFrZUxpbmVBQ2h1bmsobGluZU51bWJlcik7Ci0gICAg
ICAgIHRoaXMuZWxlbWVudC5zY3JvbGxUb3AgPSBjaHVuay5vZmZzZXRUb3A7Ci0gICAgfSwKLQot
ICAgIC8qKgotICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lTnVtYmVyCi0gICAgICovCi0gICAg
cmV2ZWFsTGluZTogZnVuY3Rpb24obGluZU51bWJlcikKLSAgICB7Ci0gICAgICAgIGlmIChsaW5l
TnVtYmVyID49IHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50KQotICAgICAgICAgICAgcmV0dXJu
OwotCi0gICAgICAgIHZhciBjaHVuayA9IHRoaXMubWFrZUxpbmVBQ2h1bmsobGluZU51bWJlcik7
Ci0gICAgICAgIGNodW5rLmVsZW1lbnQuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpOwotICAgIH0s
Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU51bWJlcgotICAgICAqIEBw
YXJhbSB7c3RyaW5nfEVsZW1lbnR9IGRlY29yYXRpb24KLSAgICAgKi8KLSAgICBhZGREZWNvcmF0
aW9uOiBmdW5jdGlvbihsaW5lTnVtYmVyLCBkZWNvcmF0aW9uKQotICAgIHsKLSAgICAgICAgaWYg
KGxpbmVOdW1iZXIgPj0gdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQpCi0gICAgICAgICAgICBy
ZXR1cm47Ci0KLSAgICAgICAgdmFyIGNodW5rID0gdGhpcy5tYWtlTGluZUFDaHVuayhsaW5lTnVt
YmVyKTsKLSAgICAgICAgY2h1bmsuYWRkRGVjb3JhdGlvbihkZWNvcmF0aW9uKTsKLSAgICB9LAot
Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIKLSAgICAgKiBAcGFy
YW0ge3N0cmluZ3xFbGVtZW50fSBkZWNvcmF0aW9uCi0gICAgICovCi0gICAgcmVtb3ZlRGVjb3Jh
dGlvbjogZnVuY3Rpb24obGluZU51bWJlciwgZGVjb3JhdGlvbikKLSAgICB7Ci0gICAgICAgIGlm
IChsaW5lTnVtYmVyID49IHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50KQotICAgICAgICAgICAg
cmV0dXJuOwotCi0gICAgICAgIHZhciBjaHVuayA9IHRoaXMuY2h1bmtGb3JMaW5lKGxpbmVOdW1i
ZXIpOwotICAgICAgICBjaHVuay5yZW1vdmVEZWNvcmF0aW9uKGRlY29yYXRpb24pOwotICAgIH0s
Ci0KLSAgICBfYnVpbGRDaHVua3M6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVn
aW5Eb21VcGRhdGVzKCk7Ci0KLSAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZUNoaWxkcmVu
KCk7Ci0KLSAgICAgICAgdGhpcy5fdGV4dENodW5rcyA9IFtdOwotICAgICAgICBmb3IgKHZhciBp
ID0gMDsgaSA8IHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50OyBpICs9IHRoaXMuX2RlZmF1bHRD
aHVua1NpemUpIHsKLSAgICAgICAgICAgIHZhciBjaHVuayA9IHRoaXMuX2NyZWF0ZU5ld0NodW5r
KGksIGkgKyB0aGlzLl9kZWZhdWx0Q2h1bmtTaXplKTsKLSAgICAgICAgICAgIHRoaXMuX3RleHRD
aHVua3MucHVzaChjaHVuayk7Ci0gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hp
bGQoY2h1bmsuZWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLl9yZXBhaW50QWxs
KCk7Ci0KLSAgICAgICAgdGhpcy5lbmREb21VcGRhdGVzKCk7Ci0gICAgfSwKLQotICAgIC8qKgot
ICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lTnVtYmVyCi0gICAgICovCi0gICAgbWFrZUxpbmVB
Q2h1bms6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCi0gICAgewotICAgICAgICB2YXIgY2h1bmtOdW1i
ZXIgPSB0aGlzLl9jaHVua051bWJlckZvckxpbmUobGluZU51bWJlcik7Ci0gICAgICAgIHZhciBv
bGRDaHVuayA9IHRoaXMuX3RleHRDaHVua3NbY2h1bmtOdW1iZXJdOwotCi0gICAgICAgIGlmICgh
b2xkQ2h1bmspIHsKLSAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIk5vIGNodW5rIGZvciBsaW5l
IG51bWJlcjogIiArIGxpbmVOdW1iZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9
Ci0KLSAgICAgICAgaWYgKG9sZENodW5rLmxpbmVzQ291bnQgPT09IDEpCi0gICAgICAgICAgICBy
ZXR1cm4gb2xkQ2h1bms7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuX3NwbGl0Q2h1bmtPbkFMaW5l
KGxpbmVOdW1iZXIsIGNodW5rTnVtYmVyLCB0cnVlKTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAg
ICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIKLSAgICAgKiBAcGFyYW0ge251bWJlcn0gY2h1
bmtOdW1iZXIKLSAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBjcmVhdGVTdWZmaXhDaHVuawotICAg
ICAqLwotICAgIF9zcGxpdENodW5rT25BTGluZTogZnVuY3Rpb24obGluZU51bWJlciwgY2h1bmtO
dW1iZXIsIGNyZWF0ZVN1ZmZpeENodW5rKQotICAgIHsKLSAgICAgICAgdGhpcy5iZWdpbkRvbVVw
ZGF0ZXMoKTsKLQotICAgICAgICB2YXIgb2xkQ2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtzW2NodW5r
TnVtYmVyXTsKLSAgICAgICAgdmFyIHdhc0V4cGFuZGVkID0gb2xkQ2h1bmsuZXhwYW5kZWQ7Ci0g
ICAgICAgIG9sZENodW5rLmV4cGFuZGVkID0gZmFsc2U7Ci0KLSAgICAgICAgdmFyIGluc2VydElu
ZGV4ID0gY2h1bmtOdW1iZXIgKyAxOwotCi0gICAgICAgIC8vIFByZWZpeCBjaHVuay4KLSAgICAg
ICAgaWYgKGxpbmVOdW1iZXIgPiBvbGRDaHVuay5zdGFydExpbmUpIHsKLSAgICAgICAgICAgIHZh
ciBwcmVmaXhDaHVuayA9IHRoaXMuX2NyZWF0ZU5ld0NodW5rKG9sZENodW5rLnN0YXJ0TGluZSwg
bGluZU51bWJlcik7Ci0gICAgICAgICAgICBwcmVmaXhDaHVuay5yZWFkT25seSA9IG9sZENodW5r
LnJlYWRPbmx5OwotICAgICAgICAgICAgdGhpcy5fdGV4dENodW5rcy5zcGxpY2UoaW5zZXJ0SW5k
ZXgrKywgMCwgcHJlZml4Q2h1bmspOwotICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmluc2Vy
dEJlZm9yZShwcmVmaXhDaHVuay5lbGVtZW50LCBvbGRDaHVuay5lbGVtZW50KTsKLSAgICAgICAg
fQotCi0gICAgICAgIC8vIExpbmUgY2h1bmsuCi0gICAgICAgIHZhciBlbmRMaW5lID0gY3JlYXRl
U3VmZml4Q2h1bmsgPyBsaW5lTnVtYmVyICsgMSA6IG9sZENodW5rLnN0YXJ0TGluZSArIG9sZENo
dW5rLmxpbmVzQ291bnQ7Ci0gICAgICAgIHZhciBsaW5lQ2h1bmsgPSB0aGlzLl9jcmVhdGVOZXdD
aHVuayhsaW5lTnVtYmVyLCBlbmRMaW5lKTsKLSAgICAgICAgbGluZUNodW5rLnJlYWRPbmx5ID0g
b2xkQ2h1bmsucmVhZE9ubHk7Ci0gICAgICAgIHRoaXMuX3RleHRDaHVua3Muc3BsaWNlKGluc2Vy
dEluZGV4KyssIDAsIGxpbmVDaHVuayk7Ci0gICAgICAgIHRoaXMuX2NvbnRhaW5lci5pbnNlcnRC
ZWZvcmUobGluZUNodW5rLmVsZW1lbnQsIG9sZENodW5rLmVsZW1lbnQpOwotCi0gICAgICAgIC8v
IFN1ZmZpeCBjaHVuay4KLSAgICAgICAgaWYgKG9sZENodW5rLnN0YXJ0TGluZSArIG9sZENodW5r
LmxpbmVzQ291bnQgPiBlbmRMaW5lKSB7Ci0gICAgICAgICAgICB2YXIgc3VmZml4Q2h1bmsgPSB0
aGlzLl9jcmVhdGVOZXdDaHVuayhlbmRMaW5lLCBvbGRDaHVuay5zdGFydExpbmUgKyBvbGRDaHVu
ay5saW5lc0NvdW50KTsKLSAgICAgICAgICAgIHN1ZmZpeENodW5rLnJlYWRPbmx5ID0gb2xkQ2h1
bmsucmVhZE9ubHk7Ci0gICAgICAgICAgICB0aGlzLl90ZXh0Q2h1bmtzLnNwbGljZShpbnNlcnRJ
bmRleCwgMCwgc3VmZml4Q2h1bmspOwotICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmluc2Vy
dEJlZm9yZShzdWZmaXhDaHVuay5lbGVtZW50LCBvbGRDaHVuay5lbGVtZW50KTsKLSAgICAgICAg
fQotCi0gICAgICAgIC8vIFJlbW92ZSBlbmNsb3NpbmcgY2h1bmsuCi0gICAgICAgIHRoaXMuX3Rl
eHRDaHVua3Muc3BsaWNlKGNodW5rTnVtYmVyLCAxKTsKLSAgICAgICAgdGhpcy5fY29udGFpbmVy
LnJlbW92ZUNoaWxkKG9sZENodW5rLmVsZW1lbnQpOwotCi0gICAgICAgIGlmICh3YXNFeHBhbmRl
ZCkgewotICAgICAgICAgICAgaWYgKHByZWZpeENodW5rKQotICAgICAgICAgICAgICAgIHByZWZp
eENodW5rLmV4cGFuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGxpbmVDaHVuay5leHBhbmRlZCA9
IHRydWU7Ci0gICAgICAgICAgICBpZiAoc3VmZml4Q2h1bmspCi0gICAgICAgICAgICAgICAgc3Vm
Zml4Q2h1bmsuZXhwYW5kZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5lbmRE
b21VcGRhdGVzKCk7Ci0KLSAgICAgICAgcmV0dXJuIGxpbmVDaHVuazsKLSAgICB9LAotCi0gICAg
X3Njcm9sbDogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdGhpcy5fc2NoZWR1bGVSZXBhaW50
QWxsKCk7Ci0gICAgICAgIGlmICh0aGlzLl9zeW5jU2Nyb2xsTGlzdGVuZXIpCi0gICAgICAgICAg
ICB0aGlzLl9zeW5jU2Nyb2xsTGlzdGVuZXIoKTsKLSAgICB9LAotCi0gICAgX3NjaGVkdWxlUmVw
YWludEFsbDogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuX3JlcGFpbnRBbGxU
aW1lcikKLSAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXBhaW50QWxsVGltZXIpOwot
ICAgICAgICB0aGlzLl9yZXBhaW50QWxsVGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuX3JlcGFpbnRB
bGwuYmluZCh0aGlzKSwgNTApOwotICAgIH0sCi0KLSAgICBiZWdpblVwZGF0ZXM6IGZ1bmN0aW9u
KCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX3BhaW50Q29hbGVzY2luZ0xldmVsKys7Ci0gICAgfSwK
LQotICAgIGVuZFVwZGF0ZXM6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX3BhaW50
Q29hbGVzY2luZ0xldmVsLS07Ci0gICAgICAgIGlmICghdGhpcy5fcGFpbnRDb2FsZXNjaW5nTGV2
ZWwpCi0gICAgICAgICAgICB0aGlzLl9yZXBhaW50QWxsKCk7Ci0gICAgfSwKLQotICAgIGJlZ2lu
RG9tVXBkYXRlczogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdGhpcy5fZG9tVXBkYXRlQ29h
bGVzY2luZ0xldmVsKys7Ci0gICAgfSwKLQotICAgIGVuZERvbVVwZGF0ZXM6IGZ1bmN0aW9uKCkK
LSAgICB7Ci0gICAgICAgIHRoaXMuX2RvbVVwZGF0ZUNvYWxlc2NpbmdMZXZlbC0tOwotICAgIH0s
Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU51bWJlcgotICAgICAqLwot
ICAgIF9jaHVua051bWJlckZvckxpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCi0gICAgewotICAg
ICAgICBmdW5jdGlvbiBjb21wYXJlTGluZU51bWJlcnModmFsdWUsIGNodW5rKQotICAgICAgICB7
Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUgPCBjaHVuay5zdGFydExpbmUgPyAtMSA6IDE7Ci0g
ICAgICAgIH0KLSAgICAgICAgdmFyIGluc2VydEJlZm9yZSA9IGluc2VydGlvbkluZGV4Rm9yT2Jq
ZWN0SW5MaXN0U29ydGVkQnlGdW5jdGlvbihsaW5lTnVtYmVyLCB0aGlzLl90ZXh0Q2h1bmtzLCBj
b21wYXJlTGluZU51bWJlcnMpOwotICAgICAgICByZXR1cm4gaW5zZXJ0QmVmb3JlIC0gMTsKLSAg
ICB9LAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIKLSAgICAg
Ki8KLSAgICBjaHVua0ZvckxpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCi0gICAgewotICAgICAg
ICByZXR1cm4gdGhpcy5fdGV4dENodW5rc1t0aGlzLl9jaHVua051bWJlckZvckxpbmUobGluZU51
bWJlcildOwotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ge251bWJlcn0gdmlzaWJs
ZUZyb20KLSAgICAgKi8KLSAgICBfZmluZEZpcnN0VmlzaWJsZUNodW5rTnVtYmVyOiBmdW5jdGlv
bih2aXNpYmxlRnJvbSkKLSAgICB7Ci0gICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVPZmZzZXRUb3Bz
KHZhbHVlLCBjaHVuaykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlIDwgY2h1
bmsub2Zmc2V0VG9wID8gLTEgOiAxOwotICAgICAgICB9Ci0gICAgICAgIHZhciBpbnNlcnRCZWZv
cmUgPSBpbnNlcnRpb25JbmRleEZvck9iamVjdEluTGlzdFNvcnRlZEJ5RnVuY3Rpb24odmlzaWJs
ZUZyb20sIHRoaXMuX3RleHRDaHVua3MsIGNvbXBhcmVPZmZzZXRUb3BzKTsKLSAgICAgICAgcmV0
dXJuIGluc2VydEJlZm9yZSAtIDE7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7
bnVtYmVyfSB2aXNpYmxlRnJvbQotICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2aXNpYmxlVG8KLSAg
ICAgKi8KLSAgICBfZmluZFZpc2libGVDaHVua3M6IGZ1bmN0aW9uKHZpc2libGVGcm9tLCB2aXNp
YmxlVG8pCi0gICAgewotICAgICAgICB2YXIgZnJvbSA9IHRoaXMuX2ZpbmRGaXJzdFZpc2libGVD
aHVua051bWJlcih2aXNpYmxlRnJvbSk7Ci0gICAgICAgIGZvciAodmFyIHRvID0gZnJvbSArIDE7
IHRvIDwgdGhpcy5fdGV4dENodW5rcy5sZW5ndGg7ICsrdG8pIHsKLSAgICAgICAgICAgIGlmICh0
aGlzLl90ZXh0Q2h1bmtzW3RvXS5vZmZzZXRUb3AgPj0gdmlzaWJsZVRvKQotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7IHN0YXJ0OiBmcm9tLCBlbmQ6
IHRvIH07Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2aXNpYmxl
RnJvbQotICAgICAqLwotICAgIF9maW5kRmlyc3RWaXNpYmxlTGluZU51bWJlcjogZnVuY3Rpb24o
dmlzaWJsZUZyb20pCi0gICAgewotICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtz
W3RoaXMuX2ZpbmRGaXJzdFZpc2libGVDaHVua051bWJlcih2aXNpYmxlRnJvbSldOwotICAgICAg
ICBpZiAoIWNodW5rLmV4cGFuZGVkKQotICAgICAgICAgICAgcmV0dXJuIGNodW5rLnN0YXJ0TGlu
ZTsKLQotICAgICAgICB2YXIgbGluZU51bWJlcnMgPSBbXTsKLSAgICAgICAgZm9yICh2YXIgaSA9
IDA7IGkgPCBjaHVuay5saW5lc0NvdW50OyArK2kpIHsKLSAgICAgICAgICAgIGxpbmVOdW1iZXJz
LnB1c2goY2h1bmsuc3RhcnRMaW5lICsgaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jdGlv
biBjb21wYXJlTGluZVJvd09mZnNldFRvcHModmFsdWUsIGxpbmVOdW1iZXIpCi0gICAgICAgIHsK
LSAgICAgICAgICAgIHZhciBsaW5lUm93ID0gY2h1bmsuZ2V0RXhwYW5kZWRMaW5lUm93KGxpbmVO
dW1iZXIpOwotICAgICAgICAgICAgcmV0dXJuIHZhbHVlIDwgbGluZVJvdy5vZmZzZXRUb3AgPyAt
MSA6IDE7Ci0gICAgICAgIH0KLSAgICAgICAgdmFyIGluc2VydEJlZm9yZSA9IGluc2VydGlvbklu
ZGV4Rm9yT2JqZWN0SW5MaXN0U29ydGVkQnlGdW5jdGlvbih2aXNpYmxlRnJvbSwgbGluZU51bWJl
cnMsIGNvbXBhcmVMaW5lUm93T2Zmc2V0VG9wcyk7Ci0gICAgICAgIHJldHVybiBsaW5lTnVtYmVy
c1tpbnNlcnRCZWZvcmUgLSAxXTsKLSAgICB9LAotCi0gICAgX3JlcGFpbnRBbGw6IGZ1bmN0aW9u
KCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzLl9yZXBhaW50QWxsVGltZXI7Ci0KLSAgICAg
ICAgaWYgKHRoaXMuX3BhaW50Q29hbGVzY2luZ0xldmVsIHx8IHRoaXMuX2RpcnR5TGluZXMpCi0g
ICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgdmFyIHZpc2libGVGcm9tID0gdGhpcy5lbGVt
ZW50LnNjcm9sbFRvcDsKLSAgICAgICAgdmFyIHZpc2libGVUbyA9IHRoaXMuZWxlbWVudC5zY3Jv
bGxUb3AgKyB0aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0OwotCi0gICAgICAgIGlmICh2aXNpYmxl
VG8pIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9maW5kVmlzaWJsZUNodW5rcyh2
aXNpYmxlRnJvbSwgdmlzaWJsZVRvKTsKLSAgICAgICAgICAgIHRoaXMuX2V4cGFuZENodW5rcyhy
ZXN1bHQuc3RhcnQsIHJlc3VsdC5lbmQpOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIC8qKgot
ICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXgKLSAgICAgKiBAcGFyYW0ge251bWJlcn0g
dG9JbmRleAotICAgICAqLwotICAgIF9leHBhbmRDaHVua3M6IGZ1bmN0aW9uKGZyb21JbmRleCwg
dG9JbmRleCkKLSAgICB7Ci0gICAgICAgIC8vIEZpcnN0IGNvbGxhcHNlIGNodW5rcyB0byBjb2xs
ZWN0IHRoZSBET00gZWxlbWVudHMgaW50byBhIGNhY2hlIHRvIHJldXNlIHRoZW0gbGF0ZXIuCi0g
ICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZnJvbUluZGV4OyArK2kpCi0gICAgICAgICAgICB0
aGlzLl90ZXh0Q2h1bmtzW2ldLmV4cGFuZGVkID0gZmFsc2U7Ci0gICAgICAgIGZvciAodmFyIGkg
PSB0b0luZGV4OyBpIDwgdGhpcy5fdGV4dENodW5rcy5sZW5ndGg7ICsraSkKLSAgICAgICAgICAg
IHRoaXMuX3RleHRDaHVua3NbaV0uZXhwYW5kZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yICh2YXIg
aSA9IGZyb21JbmRleDsgaSA8IHRvSW5kZXg7ICsraSkKLSAgICAgICAgICAgIHRoaXMuX3RleHRD
aHVua3NbaV0uZXhwYW5kZWQgPSB0cnVlOwotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcGFy
YW0ge0VsZW1lbnR9IGZpcnN0RWxlbWVudAotICAgICAqIEBwYXJhbSB7RWxlbWVudD19IGxhc3RF
bGVtZW50Ci0gICAgICovCi0gICAgX3RvdGFsSGVpZ2h0OiBmdW5jdGlvbihmaXJzdEVsZW1lbnQs
IGxhc3RFbGVtZW50KQotICAgIHsKLSAgICAgICAgbGFzdEVsZW1lbnQgPSAobGFzdEVsZW1lbnQg
fHwgZmlyc3RFbGVtZW50KS5uZXh0RWxlbWVudFNpYmxpbmc7Ci0gICAgICAgIGlmIChsYXN0RWxl
bWVudCkKLSAgICAgICAgICAgIHJldHVybiBsYXN0RWxlbWVudC5vZmZzZXRUb3AgLSBmaXJzdEVs
ZW1lbnQub2Zmc2V0VG9wOwotCi0gICAgICAgIHZhciBvZmZzZXRQYXJlbnQgPSBmaXJzdEVsZW1l
bnQub2Zmc2V0UGFyZW50OwotICAgICAgICBpZiAob2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVu
dC5zY3JvbGxIZWlnaHQgPiBvZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0KQotICAgICAgICAgICAg
cmV0dXJuIG9mZnNldFBhcmVudC5zY3JvbGxIZWlnaHQgLSBmaXJzdEVsZW1lbnQub2Zmc2V0VG9w
OwotCi0gICAgICAgIHZhciB0b3RhbCA9IDA7Ci0gICAgICAgIHdoaWxlIChmaXJzdEVsZW1lbnQg
JiYgZmlyc3RFbGVtZW50ICE9PSBsYXN0RWxlbWVudCkgewotICAgICAgICAgICAgdG90YWwgKz0g
Zmlyc3RFbGVtZW50Lm9mZnNldEhlaWdodDsKLSAgICAgICAgICAgIGZpcnN0RWxlbWVudCA9IGZp
cnN0RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJu
IHRvdGFsOwotICAgIH0sCi0KLSAgICByZXNpemU6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAg
IHRoaXMuX3JlcGFpbnRBbGwoKTsKLSAgICB9Ci19Ci0KLS8qKgotICogQGNvbnN0cnVjdG9yCi0g
KiBAZXh0ZW5kcyB7V2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2VkUGFuZWx9Ci0gKiBAcGFy
YW0ge1dlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWx9IHRleHRNb2RlbAotICovCi1XZWJJbnNw
ZWN0b3IuVGV4dEVkaXRvckd1dHRlclBhbmVsID0gZnVuY3Rpb24odGV4dE1vZGVsLCBzeW5jRGVj
b3JhdGlvbnNGb3JMaW5lTGlzdGVuZXIsIHN5bmNMaW5lSGVpZ2h0TGlzdGVuZXIpCi17Ci0gICAg
V2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2VkUGFuZWwuY2FsbCh0aGlzLCB0ZXh0TW9kZWwp
OwotCi0gICAgdGhpcy5fc3luY0RlY29yYXRpb25zRm9yTGluZUxpc3RlbmVyID0gc3luY0RlY29y
YXRpb25zRm9yTGluZUxpc3RlbmVyOwotICAgIHRoaXMuX3N5bmNMaW5lSGVpZ2h0TGlzdGVuZXIg
PSBzeW5jTGluZUhlaWdodExpc3RlbmVyOwotCi0gICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0gICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9ICJ0ZXh0
LWVkaXRvci1saW5lcyI7Ci0KLSAgICB0aGlzLl9jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVF
bGVtZW50KCJkaXYiKTsKLSAgICB0aGlzLl9jb250YWluZXIuY2xhc3NOYW1lID0gImlubmVyLWNv
bnRhaW5lciI7Ci0gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lcik7
Ci0KLSAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgdGhpcy5fc2Ny
b2xsLmJpbmQodGhpcyksIGZhbHNlKTsKLQotICAgIHRoaXMuZnJlZUNhY2hlZEVsZW1lbnRzKCk7
Ci0gICAgdGhpcy5fYnVpbGRDaHVua3MoKTsKLSAgICB0aGlzLl9kZWNvcmF0aW9ucyA9IHt9Owot
fQotCi1XZWJJbnNwZWN0b3IuVGV4dEVkaXRvckd1dHRlclBhbmVsLnByb3RvdHlwZSA9IHsKLSAg
ICBmcmVlQ2FjaGVkRWxlbWVudHM6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2Nh
Y2hlZFJvd3MgPSBbXTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHtudW1iZXJ9
IHN0YXJ0TGluZQotICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmRMaW5lCi0gICAgICovCi0gICAg
X2NyZWF0ZU5ld0NodW5rOiBmdW5jdGlvbihzdGFydExpbmUsIGVuZExpbmUpCi0gICAgewotICAg
ICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yR3V0dGVyQ2h1bmsodGhpcywg
c3RhcnRMaW5lLCBlbmRMaW5lKTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHtX
ZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSBvbGRSYW5nZQotICAgICAqIEBwYXJhbSB7V2ViSW5zcGVj
dG9yLlRleHRSYW5nZX0gbmV3UmFuZ2UKLSAgICAgKi8KLSAgICB0ZXh0Q2hhbmdlZDogZnVuY3Rp
b24ob2xkUmFuZ2UsIG5ld1JhbmdlKQotICAgIHsKLSAgICAgICAgdGhpcy5iZWdpbkRvbVVwZGF0
ZXMoKTsKLQotICAgICAgICB2YXIgbGluZXNEaWZmID0gbmV3UmFuZ2UubGluZXNDb3VudCAtIG9s
ZFJhbmdlLmxpbmVzQ291bnQ7Ci0gICAgICAgIGlmIChsaW5lc0RpZmYpIHsKLSAgICAgICAgICAg
IC8vIFJlbW92ZSBvbGQgY2h1bmtzIChpZiBuZWVkZWQpLgotICAgICAgICAgICAgZm9yICh2YXIg
Y2h1bmtOdW1iZXIgPSB0aGlzLl90ZXh0Q2h1bmtzLmxlbmd0aCAtIDE7IGNodW5rTnVtYmVyID49
IDAgOyAtLWNodW5rTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgdmFyIGNodW5rID0gdGhpcy5f
dGV4dENodW5rc1tjaHVua051bWJlcl07Ci0gICAgICAgICAgICAgICAgaWYgKGNodW5rLnN0YXJ0
TGluZSArIGNodW5rLmxpbmVzQ291bnQgPD0gdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQpCi0g
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNodW5rLmV4cGFuZGVk
ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZUNoaWxkKGNo
dW5rLmVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5fdGV4dENodW5r
cy5sZW5ndGggPSBjaHVua051bWJlciArIDE7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBuZXcgY2h1
bmtzIChpZiBuZWVkZWQpLgotICAgICAgICAgICAgdmFyIHRvdGFsTGluZXMgPSAwOwotICAgICAg
ICAgICAgaWYgKHRoaXMuX3RleHRDaHVua3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdmFy
IGxhc3RDaHVuayA9IHRoaXMuX3RleHRDaHVua3NbdGhpcy5fdGV4dENodW5rcy5sZW5ndGggLSAx
XTsKLSAgICAgICAgICAgICAgICB0b3RhbExpbmVzID0gbGFzdENodW5rLnN0YXJ0TGluZSArIGxh
c3RDaHVuay5saW5lc0NvdW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKHZh
ciBpID0gdG90YWxMaW5lczsgaSA8IHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50OyBpICs9IHRo
aXMuX2RlZmF1bHRDaHVua1NpemUpIHsKLSAgICAgICAgICAgICAgICB2YXIgY2h1bmsgPSB0aGlz
Ll9jcmVhdGVOZXdDaHVuayhpLCBpICsgdGhpcy5fZGVmYXVsdENodW5rU2l6ZSk7Ci0gICAgICAg
ICAgICAgICAgdGhpcy5fdGV4dENodW5rcy5wdXNoKGNodW5rKTsKLSAgICAgICAgICAgICAgICB0
aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoY2h1bmsuZWxlbWVudCk7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIC8vIFNoaWZ0IGRlY29yYXRpb25zIGlmIG5lY2Vzc2FyeQotICAgICAg
ICAgICAgZm9yICh2YXIgbGluZU51bWJlciBpbiB0aGlzLl9kZWNvcmF0aW9ucykgewotICAgICAg
ICAgICAgICAgIGxpbmVOdW1iZXIgPSBwYXJzZUludChsaW5lTnVtYmVyLCAxMCk7Ci0KLSAgICAg
ICAgICAgICAgICAvLyBEbyBub3QgbW92ZSBkZWNvcmF0aW9ucyBiZWZvcmUgdGhlIHN0YXJ0IHBv
c2l0aW9uLgotICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyIDwgb2xkUmFuZ2Uuc3RhcnRM
aW5lKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAvLyBE
ZWNvcmF0aW9ucyBmb2xsb3cgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBsaW5lLgotICAgICAgICAg
ICAgICAgIGlmIChsaW5lTnVtYmVyID09PSBvbGRSYW5nZS5zdGFydExpbmUgJiYgb2xkUmFuZ2Uu
c3RhcnRDb2x1bW4pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAg
ICAgICAgdmFyIGxpbmVEZWNvcmF0aW9uc0NvcHkgPSB0aGlzLl9kZWNvcmF0aW9uc1tsaW5lTnVt
YmVyXS5zbGljZSgpOwotICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZURl
Y29yYXRpb25zQ29weS5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICB2YXIgZGVj
b3JhdGlvbiA9IGxpbmVEZWNvcmF0aW9uc0NvcHlbaV07Ci0gICAgICAgICAgICAgICAgICAgIHRo
aXMucmVtb3ZlRGVjb3JhdGlvbihsaW5lTnVtYmVyLCBkZWNvcmF0aW9uKTsKLQotICAgICAgICAg
ICAgICAgICAgICAvLyBEbyBub3QgcmVzdG9yZSB0aGUgZGVjb3JhdGlvbnMgYmVmb3JlIHRoZSBl
bmQgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyIDwgb2xkUmFu
Z2UuZW5kTGluZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAg
ICAgICAgICAgICAgIHRoaXMuYWRkRGVjb3JhdGlvbihsaW5lTnVtYmVyICsgbGluZXNEaWZmLCBk
ZWNvcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIHRoaXMuX3JlcGFpbnRBbGwoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8v
IERlY29yYXRpb25zIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCwgc28gd2UgbWF5IGhhdmUgdG8gc3lu
YyB0aG9zZSBsaW5lcy4KLSAgICAgICAgICAgIHZhciBjaHVua051bWJlciA9IHRoaXMuX2NodW5r
TnVtYmVyRm9yTGluZShuZXdSYW5nZS5zdGFydExpbmUpOwotICAgICAgICAgICAgdmFyIGNodW5r
ID0gdGhpcy5fdGV4dENodW5rc1tjaHVua051bWJlcl07Ci0gICAgICAgICAgICB3aGlsZSAoY2h1
bmsgJiYgY2h1bmsuc3RhcnRMaW5lIDw9IG5ld1JhbmdlLmVuZExpbmUpIHsKLSAgICAgICAgICAg
ICAgICBpZiAoY2h1bmsubGluZXNDb3VudCA9PT0gMSkKLSAgICAgICAgICAgICAgICAgICAgdGhp
cy5fc3luY0RlY29yYXRpb25zRm9yTGluZUxpc3RlbmVyKGNodW5rLnN0YXJ0TGluZSk7Ci0gICAg
ICAgICAgICAgICAgY2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtzWysrY2h1bmtOdW1iZXJdOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5lbmREb21VcGRhdGVzKCk7Ci0g
ICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjbGllbnRIZWlnaHQKLSAg
ICAgKi8KLSAgICBzeW5jQ2xpZW50SGVpZ2h0OiBmdW5jdGlvbihjbGllbnRIZWlnaHQpCi0gICAg
ewotICAgICAgICBpZiAodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCA+IGNsaWVudEhlaWdodCkK
LSAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSgicGFkZGluZy1i
b3R0b20iLCAodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAtIGNsaWVudEhlaWdodCkgKyAicHgi
KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLnJlbW92
ZVByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIpOwotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBA
cGFyYW0ge251bWJlcn0gbGluZU51bWJlcgotICAgICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9
IGRlY29yYXRpb24KLSAgICAgKi8KLSAgICBhZGREZWNvcmF0aW9uOiBmdW5jdGlvbihsaW5lTnVt
YmVyLCBkZWNvcmF0aW9uKQotICAgIHsKLSAgICAgICAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JD
aHVua2VkUGFuZWwucHJvdG90eXBlLmFkZERlY29yYXRpb24uY2FsbCh0aGlzLCBsaW5lTnVtYmVy
LCBkZWNvcmF0aW9uKTsKLSAgICAgICAgdmFyIGRlY29yYXRpb25zID0gdGhpcy5fZGVjb3JhdGlv
bnNbbGluZU51bWJlcl07Ci0gICAgICAgIGlmICghZGVjb3JhdGlvbnMpIHsKLSAgICAgICAgICAg
IGRlY29yYXRpb25zID0gW107Ci0gICAgICAgICAgICB0aGlzLl9kZWNvcmF0aW9uc1tsaW5lTnVt
YmVyXSA9IGRlY29yYXRpb25zOwotICAgICAgICB9Ci0gICAgICAgIGRlY29yYXRpb25zLnB1c2go
ZGVjb3JhdGlvbik7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7bnVtYmVyfSBs
aW5lTnVtYmVyCi0gICAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gZGVjb3JhdGlvbgotICAg
ICAqLwotICAgIHJlbW92ZURlY29yYXRpb246IGZ1bmN0aW9uKGxpbmVOdW1iZXIsIGRlY29yYXRp
b24pCi0gICAgewotICAgICAgICBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvckNodW5rZWRQYW5lbC5w
cm90b3R5cGUucmVtb3ZlRGVjb3JhdGlvbi5jYWxsKHRoaXMsIGxpbmVOdW1iZXIsIGRlY29yYXRp
b24pOwotICAgICAgICB2YXIgZGVjb3JhdGlvbnMgPSB0aGlzLl9kZWNvcmF0aW9uc1tsaW5lTnVt
YmVyXTsKLSAgICAgICAgaWYgKGRlY29yYXRpb25zKSB7Ci0gICAgICAgICAgICBkZWNvcmF0aW9u
cy5yZW1vdmUoZGVjb3JhdGlvbik7Ci0gICAgICAgICAgICBpZiAoIWRlY29yYXRpb25zLmxlbmd0
aCkKLSAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fZGVjb3JhdGlvbnNbbGluZU51bWJlcl07
Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLVdlYkluc3BlY3Rvci5UZXh0RWRpdG9yR3V0dGVyUGFu
ZWwucHJvdG90eXBlLl9fcHJvdG9fXyA9IFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yQ2h1bmtlZFBh
bmVsLnByb3RvdHlwZTsKLQotLyoqCi0gKiBAY29uc3RydWN0b3IKLSAqLwotV2ViSW5zcGVjdG9y
LlRleHRFZGl0b3JHdXR0ZXJDaHVuayA9IGZ1bmN0aW9uKHRleHRFZGl0b3IsIHN0YXJ0TGluZSwg
ZW5kTGluZSkKLXsKLSAgICB0aGlzLl90ZXh0RWRpdG9yID0gdGV4dEVkaXRvcjsKLSAgICB0aGlz
Ll90ZXh0TW9kZWwgPSB0ZXh0RWRpdG9yLl90ZXh0TW9kZWw7Ci0KLSAgICB0aGlzLnN0YXJ0TGlu
ZSA9IHN0YXJ0TGluZTsKLSAgICBlbmRMaW5lID0gTWF0aC5taW4odGhpcy5fdGV4dE1vZGVsLmxp
bmVzQ291bnQsIGVuZExpbmUpOwotICAgIHRoaXMubGluZXNDb3VudCA9IGVuZExpbmUgLSBzdGFy
dExpbmU7Ci0KLSAgICB0aGlzLl9leHBhbmRlZCA9IGZhbHNlOwotCi0gICAgdGhpcy5lbGVtZW50
ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0gICAgdGhpcy5lbGVtZW50LmxpbmVO
dW1iZXIgPSBzdGFydExpbmU7Ci0gICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9ICJ3ZWJraXQt
bGluZS1udW1iZXIiOwotCi0gICAgaWYgKHRoaXMubGluZXNDb3VudCA9PT0gMSkgewotICAgICAg
ICAvLyBTaW5nbGUgbGluZSBjaHVua3MgYXJlIHR5cGljYWxseSBjcmVhdGVkIGZvciBkZWNvcmF0
aW9ucy4gSG9zdCBsaW5lIG51bWJlciBpbgotICAgICAgICAvLyB0aGUgc3ViLWVsZW1lbnQgaW4g
b3JkZXIgdG8gYWxsb3cgZmxleGlibGUgYm9yZGVyIC8gbWFyZ2luIG1hbmFnZW1lbnQuCi0gICAg
ICAgIHZhciBpbm5lclNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Ci0gICAg
ICAgIGlubmVyU3Bhbi5jbGFzc05hbWUgPSAid2Via2l0LWxpbmUtbnVtYmVyLWlubmVyIjsKLSAg
ICAgICAgaW5uZXJTcGFuLnRleHRDb250ZW50ID0gc3RhcnRMaW5lICsgMTsKLSAgICAgICAgdmFy
IG91dGVyU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotICAgICAgICBvdXRl
clNwYW4uY2xhc3NOYW1lID0gIndlYmtpdC1saW5lLW51bWJlci1vdXRlciI7Ci0gICAgICAgIG91
dGVyU3Bhbi5hcHBlbmRDaGlsZChpbm5lclNwYW4pOwotICAgICAgICB0aGlzLmVsZW1lbnQuYXBw
ZW5kQ2hpbGQob3V0ZXJTcGFuKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YXIgbGluZU51bWJl
cnMgPSBbXTsKLSAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0TGluZTsgaSA8IGVuZExpbmU7ICsr
aSkKLSAgICAgICAgICAgIGxpbmVOdW1iZXJzLnB1c2goaSArIDEpOwotICAgICAgICB0aGlzLmVs
ZW1lbnQudGV4dENvbnRlbnQgPSBsaW5lTnVtYmVycy5qb2luKCJcbiIpOwotICAgIH0KLX0KLQot
V2ViSW5zcGVjdG9yLlRleHRFZGl0b3JHdXR0ZXJDaHVuay5wcm90b3R5cGUgPSB7Ci0gICAgLyoq
Ci0gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlY29yYXRpb24KLSAgICAgKi8KLSAgICBhZGREZWNv
cmF0aW9uOiBmdW5jdGlvbihkZWNvcmF0aW9uKQotICAgIHsKLSAgICAgICAgdGhpcy5fdGV4dEVk
aXRvci5iZWdpbkRvbVVwZGF0ZXMoKTsKLSAgICAgICAgaWYgKHR5cGVvZiBkZWNvcmF0aW9uID09
PSAic3RyaW5nIikKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRTdHlsZUNsYXNzKGRlY29y
YXRpb24pOwotICAgICAgICB0aGlzLl90ZXh0RWRpdG9yLmVuZERvbVVwZGF0ZXMoKTsKLSAgICB9
LAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlY29yYXRpb24KLSAgICAgKi8K
LSAgICByZW1vdmVEZWNvcmF0aW9uOiBmdW5jdGlvbihkZWNvcmF0aW9uKQotICAgIHsKLSAgICAg
ICAgdGhpcy5fdGV4dEVkaXRvci5iZWdpbkRvbVVwZGF0ZXMoKTsKLSAgICAgICAgaWYgKHR5cGVv
ZiBkZWNvcmF0aW9uID09PSAic3RyaW5nIikKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1v
dmVTdHlsZUNsYXNzKGRlY29yYXRpb24pOwotICAgICAgICB0aGlzLl90ZXh0RWRpdG9yLmVuZERv
bVVwZGF0ZXMoKTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB7Ym9vbGVhbn0K
LSAgICAgKi8KLSAgICBnZXQgZXhwYW5kZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
X2V4cGFuZGVkOwotICAgIH0sCi0KLSAgICBzZXQgZXhwYW5kZWQoZXhwYW5kZWQpCi0gICAgewot
ICAgICAgICBpZiAodGhpcy5saW5lc0NvdW50ID09PSAxKQotICAgICAgICAgICAgdGhpcy5fdGV4
dEVkaXRvci5fc3luY0RlY29yYXRpb25zRm9yTGluZUxpc3RlbmVyKHRoaXMuc3RhcnRMaW5lKTsK
LQotICAgICAgICBpZiAodGhpcy5fZXhwYW5kZWQgPT09IGV4cGFuZGVkKQotICAgICAgICAgICAg
cmV0dXJuOwotCi0gICAgICAgIHRoaXMuX2V4cGFuZGVkID0gZXhwYW5kZWQ7Ci0KLSAgICAgICAg
aWYgKHRoaXMubGluZXNDb3VudCA9PT0gMSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAg
ICB0aGlzLl90ZXh0RWRpdG9yLmJlZ2luRG9tVXBkYXRlcygpOwotCi0gICAgICAgIGlmIChleHBh
bmRlZCkgewotICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWRMaW5lUm93cyA9IFtdOwotICAgICAg
ICAgICAgdmFyIHBhcmVudEVsZW1lbnQgPSB0aGlzLmVsZW1lbnQucGFyZW50RWxlbWVudDsKLSAg
ICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnN0YXJ0TGluZTsgaSA8IHRoaXMuc3RhcnRMaW5l
ICsgdGhpcy5saW5lc0NvdW50OyArK2kpIHsKLSAgICAgICAgICAgICAgICB2YXIgbGluZVJvdyA9
IHRoaXMuX2NyZWF0ZVJvdyhpKTsKLSAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50Lmluc2Vy
dEJlZm9yZShsaW5lUm93LCB0aGlzLmVsZW1lbnQpOwotICAgICAgICAgICAgICAgIHRoaXMuX2V4
cGFuZGVkTGluZVJvd3MucHVzaChsaW5lUm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IHBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50KTsKLSAgICAgICAgICAgIHRo
aXMuX3RleHRFZGl0b3IuX3N5bmNMaW5lSGVpZ2h0TGlzdGVuZXIodGhpcy5fZXhwYW5kZWRMaW5l
Um93c1swXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YXIgZWxlbWVudEluc2Vy
dGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2V4cGFu
ZGVkTGluZVJvd3MubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICB2YXIgbGluZVJvdyA9
IHRoaXMuX2V4cGFuZGVkTGluZVJvd3NbaV07Ci0gICAgICAgICAgICAgICAgdmFyIHBhcmVudEVs
ZW1lbnQgPSBsaW5lUm93LnBhcmVudEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVu
dEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SW5zZXJ0ZWQpIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbnNlcnRlZCA9IHRydWU7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnQs
IGxpbmVSb3cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBh
cmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQobGluZVJvdyk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0b3IuX2NhY2hlZFJvd3MucHVzaChsaW5lUm93KTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9leHBhbmRlZExpbmVSb3dz
OwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5fdGV4dEVkaXRvci5lbmREb21VcGRhdGVzKCk7
Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4ge251bWJlcn0KLSAgICAgKi8KLSAg
ICBnZXQgaGVpZ2h0KCkKLSAgICB7Ci0gICAgICAgIGlmICghdGhpcy5fZXhwYW5kZWRMaW5lUm93
cykKLSAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZXh0RWRpdG9yLl90b3RhbEhlaWdodCh0aGlz
LmVsZW1lbnQpOwotICAgICAgICByZXR1cm4gdGhpcy5fdGV4dEVkaXRvci5fdG90YWxIZWlnaHQo
dGhpcy5fZXhwYW5kZWRMaW5lUm93c1swXSwgdGhpcy5fZXhwYW5kZWRMaW5lUm93c1t0aGlzLl9l
eHBhbmRlZExpbmVSb3dzLmxlbmd0aCAtIDFdKTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICog
QHJldHVybiB7bnVtYmVyfQotICAgICAqLwotICAgIGdldCBvZmZzZXRUb3AoKQotICAgIHsKLSAg
ICAgICAgcmV0dXJuICh0aGlzLl9leHBhbmRlZExpbmVSb3dzICYmIHRoaXMuX2V4cGFuZGVkTGlu
ZVJvd3MubGVuZ3RoKSA/IHRoaXMuX2V4cGFuZGVkTGluZVJvd3NbMF0ub2Zmc2V0VG9wIDogdGhp
cy5lbGVtZW50Lm9mZnNldFRvcDsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHtu
dW1iZXJ9IGxpbmVOdW1iZXIKLSAgICAgKiBAcmV0dXJuIHtFbGVtZW50fQotICAgICAqLwotICAg
IF9jcmVhdGVSb3c6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCi0gICAgewotICAgICAgICB2YXIgbGlu
ZVJvdyA9IHRoaXMuX3RleHRFZGl0b3IuX2NhY2hlZFJvd3MucG9wKCkgfHwgZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCgiZGl2Iik7Ci0gICAgICAgIGxpbmVSb3cubGluZU51bWJlciA9IGxpbmVOdW1i
ZXI7Ci0gICAgICAgIGxpbmVSb3cuY2xhc3NOYW1lID0gIndlYmtpdC1saW5lLW51bWJlciI7Ci0g
ICAgICAgIGxpbmVSb3cudGV4dENvbnRlbnQgPSBsaW5lTnVtYmVyICsgMTsKLSAgICAgICAgcmV0
dXJuIGxpbmVSb3c7Ci0gICAgfQotfQotCi0vKioKLSAqIEBjb25zdHJ1Y3RvcgotICogQGV4dGVu
ZHMge1dlYkluc3BlY3Rvci5UZXh0RWRpdG9yQ2h1bmtlZFBhbmVsfQotICogQHBhcmFtIHtXZWJJ
bnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsfSB0ZXh0TW9kZWwKLSAqIEBwYXJhbSB7P3N0cmluZ30g
dXJsCi0gKi8KLVdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTWFpblBhbmVsID0gZnVuY3Rpb24odGV4
dE1vZGVsLCB1cmwsIHN5bmNTY3JvbGxMaXN0ZW5lciwgc3luY0RlY29yYXRpb25zRm9yTGluZUxp
c3RlbmVyLCBlbnRlclRleHRDaGFuZ2VNb2RlLCBleGl0VGV4dENoYW5nZU1vZGUpCi17Ci0gICAg
V2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2VkUGFuZWwuY2FsbCh0aGlzLCB0ZXh0TW9kZWwp
OwotCi0gICAgdGhpcy5fc3luY1Njcm9sbExpc3RlbmVyID0gc3luY1Njcm9sbExpc3RlbmVyOwot
ICAgIHRoaXMuX3N5bmNEZWNvcmF0aW9uc0ZvckxpbmVMaXN0ZW5lciA9IHN5bmNEZWNvcmF0aW9u
c0ZvckxpbmVMaXN0ZW5lcjsKLSAgICB0aGlzLl9lbnRlclRleHRDaGFuZ2VNb2RlID0gZW50ZXJU
ZXh0Q2hhbmdlTW9kZTsKLSAgICB0aGlzLl9leGl0VGV4dENoYW5nZU1vZGUgPSBleGl0VGV4dENo
YW5nZU1vZGU7Ci0KLSAgICB0aGlzLl91cmwgPSB1cmw7Ci0gICAgdGhpcy5faGlnaGxpZ2h0ZXIg
PSBuZXcgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JIaWdobGlnaHRlcih0ZXh0TW9kZWwsIHRoaXMu
X2hpZ2hsaWdodERhdGFSZWFkeS5iaW5kKHRoaXMpKTsKLSAgICB0aGlzLl9yZWFkT25seSA9IHRy
dWU7Ci0KLSAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsK
LSAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gInRleHQtZWRpdG9yLWNvbnRlbnRzIjsKLSAg
ICB0aGlzLmVsZW1lbnQudGFiSW5kZXggPSAwOwotCi0gICAgdGhpcy5fY29udGFpbmVyID0gZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0gICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTmFt
ZSA9ICJpbm5lci1jb250YWluZXIiOwotICAgIHRoaXMuX2NvbnRhaW5lci50YWJJbmRleCA9IDA7
Ci0gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lcik7Ci0KLSAgICB0
aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgdGhpcy5fc2Nyb2xsLmJpbmQo
dGhpcyksIGZhbHNlKTsKLSAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMi
LCB0aGlzLl9oYW5kbGVFbGVtZW50Rm9jdXMuYmluZCh0aGlzKSwgZmFsc2UpOwotCi0gICAgLy8g
SW4gV2ViS2l0IHRoZSBET01Ob2RlUmVtb3ZlZCBldmVudCBpcyBmaXJlZCBBRlRFUiB0aGUgbm9k
ZSBpcyByZW1vdmVkLCB0aHVzIGl0IHNob3VsZCBiZQotICAgIC8vIGF0dGFjaGVkIHRvIGFsbCBE
T00gbm9kZXMgdGhhdCB3ZSB3YW50IHRvIHRyYWNrLiBJbnN0ZWFkLCB3ZSBhdHRhY2ggdGhlIERP
TU5vZGVSZW1vdmVkCi0gICAgLy8gbGlzdGVuZXJzIG9ubHkgb24gdGhlIGxpbmUgcm93cywgYW5k
IHVzZSBET01TdWJ0cmVlTW9kaWZpZWQgdG8gdHJhY2sgbm9kZSByZW1vdmFscyBpbnNpZGUKLSAg
ICAvLyB0aGUgbGluZSByb3dzLiBGb3IgbW9yZSBpbmZvIHNlZTogaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTU1NjY2Ci0gICAgLy8KLSAgICAvLyBPUFRJTUlaQVRJT04u
IEl0IGlzIHZlcnkgZXhwZW5zaXZlIHRvIGxpc3RlbiB0byB0aGUgRE9NIG11dGF0aW9uIGV2ZW50
cywgdGh1cyB3ZSByZW1vdmUgdGhlCi0gICAgLy8gbGlzdGVuZXJzIHdoZW5ldmVyIHdlIGRvIGFu
eSBpbnRlcm5hbCBET00gbWFuaXB1bGF0aW9ucyAoc3VjaCBhcyBleHBhbmQvY29sbGFwc2UgbGlu
ZSByb3dzKQotICAgIC8vIGFuZCBzZXQgdGhlIGxpc3RlbmVycyBiYWNrIHdoZW4gd2UgYXJlIGZp
bmlzaGVkLgotICAgIHRoaXMuX2hhbmRsZURPTVVwZGF0ZXNDYWxsYmFjayA9IHRoaXMuX2hhbmRs
ZURPTVVwZGF0ZXMuYmluZCh0aGlzKTsKLSAgICB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0
ZW5lcigiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkIiwgdGhpcy5faGFuZGxlRE9NVXBkYXRlc0Nh
bGxiYWNrLCBmYWxzZSk7Ci0gICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoIkRP
TU5vZGVJbnNlcnRlZCIsIHRoaXMuX2hhbmRsZURPTVVwZGF0ZXNDYWxsYmFjaywgZmFsc2UpOwot
ICAgIHRoaXMuX2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJET01TdWJ0cmVlTW9kaWZpZWQi
LCB0aGlzLl9oYW5kbGVET01VcGRhdGVzQ2FsbGJhY2ssIGZhbHNlKTsKLQotICAgIHRoaXMuZnJl
ZUNhY2hlZEVsZW1lbnRzKCk7Ci0gICAgdGhpcy5fYnVpbGRDaHVua3MoKTsKLX0KLQotV2ViSW5z
cGVjdG9yLlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlID0gewotICAgIC8qKgotICAgICAq
IEBwYXJhbSB7c3RyaW5nfSBtaW1lVHlwZQotICAgICAqLwotICAgIHNldCBtaW1lVHlwZShtaW1l
VHlwZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2hpZ2hsaWdodGVyLm1pbWVUeXBlID0gbWltZVR5
cGU7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVhZE9ubHkK
LSAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVlc3RGb2N1cwotICAgICAqLwotICAgIHNldFJl
YWRPbmx5OiBmdW5jdGlvbihyZWFkT25seSwgcmVxdWVzdEZvY3VzKQotICAgIHsKLSAgICAgICAg
aWYgKHRoaXMuX3JlYWRPbmx5ID09PSByZWFkT25seSkKLSAgICAgICAgICAgIHJldHVybjsKLQot
ICAgICAgICB0aGlzLmJlZ2luRG9tVXBkYXRlcygpOwotICAgICAgICB0aGlzLl9yZWFkT25seSA9
IHJlYWRPbmx5OwotICAgICAgICBpZiAodGhpcy5fcmVhZE9ubHkpCi0gICAgICAgICAgICB0aGlz
Ll9jb250YWluZXIucmVtb3ZlU3R5bGVDbGFzcygidGV4dC1lZGl0b3ItZWRpdGFibGUiKTsKLSAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuYWRkU3R5bGVDbGFzcygi
dGV4dC1lZGl0b3ItZWRpdGFibGUiKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0Rm9jdXMpCi0g
ICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0aW9uT25TdGFydEVkaXRpbmcoKTsKLSAg
ICAgICAgfQotICAgICAgICB0aGlzLmVuZERvbVVwZGF0ZXMoKTsKLSAgICB9LAotCi0gICAgLyoq
Ci0gICAgICogQHJldHVybiB7Ym9vbGVhbn0KLSAgICAgKi8KLSAgICByZWFkT25seTogZnVuY3Rp
b24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRPbmx5OwotICAgIH0sCi0KLSAg
ICBfaGFuZGxlRWxlbWVudEZvY3VzOiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICBpZiAoIXRo
aXMuX3JlYWRPbmx5KQotICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmZvY3VzKCk7Ci0gICAg
fSwKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4ge0VsZW1lbnR9Ci0gICAgICovCi0gICAgZGVm
YXVsdEZvY3VzZWRFbGVtZW50OiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICBpZiAodGhpcy5f
cmVhZE9ubHkpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50OwotICAgICAgICByZXR1
cm4gdGhpcy5fY29udGFpbmVyOwotICAgIH0sCi0KLSAgICBfdXBkYXRlU2VsZWN0aW9uT25TdGFy
dEVkaXRpbmc6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIC8vIGZvY3VzKCkgbmVlZHMgdG8g
Z28gZmlyc3QgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIGxhc3Qgc2VsZWN0aW9uIHdhcyBpbnNpZGUg
dGhlIGVkaXRvciBhbmQKLSAgICAgICAgLy8gdGhlICJFZGl0IiBidXR0b24gd2FzIGNsaWNrZWQu
IEluIHRoaXMgY2FzZSB3ZSBiYWlsIGF0IHRoZSBjaGVjayBiZWxvdywgYnV0IHRoZQotICAgICAg
ICAvLyBlZGl0b3IgZG9lcyBub3QgcmVjZWl2ZSB0aGUgZm9jdXMsIHRodXMgIkVzYyIgZG9lcyBu
b3QgY2FuY2VsIGVkaXRpbmcgdW50aWwgYXQgbGVhc3QKLSAgICAgICAgLy8gb25lIGNoYW5nZSBo
YXMgYmVlbiBtYWRlIHRvIHRoZSBlZGl0b3IgY29udGVudHMuCi0gICAgICAgIHRoaXMuX2NvbnRh
aW5lci5mb2N1cygpOwotICAgICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlv
bigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQpIHsKLSAgICAgICAgICAgIHZh
ciBjb21tb25BbmNlc3RvckNvbnRhaW5lciA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1v
bkFuY2VzdG9yQ29udGFpbmVyOwotICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lci5pc1Nl
bGZPckFuY2VzdG9yKGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7
Ci0gICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIHJh
bmdlLnNldFN0YXJ0KHRoaXMuX2NvbnRhaW5lciwgMCk7Ci0gICAgICAgIHJhbmdlLnNldEVuZCh0
aGlzLl9jb250YWluZXIsIDApOwotICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpOwot
ICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRMaW5lCi0gICAg
ICogQHBhcmFtIHtudW1iZXJ9IGVuZExpbmUKLSAgICAgKi8KLSAgICBzZXRFZGl0YWJsZVJhbmdl
OiBmdW5jdGlvbihzdGFydExpbmUsIGVuZExpbmUpCi0gICAgewotICAgICAgICB0aGlzLmJlZ2lu
RG9tVXBkYXRlcygpOwotCi0gICAgICAgIHZhciBmaXJzdENodW5rTnVtYmVyID0gdGhpcy5fY2h1
bmtOdW1iZXJGb3JMaW5lKHN0YXJ0TGluZSk7Ci0gICAgICAgIHZhciBmaXJzdENodW5rID0gdGhp
cy5fdGV4dENodW5rc1tmaXJzdENodW5rTnVtYmVyXTsKLSAgICAgICAgaWYgKGZpcnN0Q2h1bmsu
c3RhcnRMaW5lICE9PSBzdGFydExpbmUpIHsKLSAgICAgICAgICAgIHRoaXMuX3NwbGl0Q2h1bmtP
bkFMaW5lKHN0YXJ0TGluZSwgZmlyc3RDaHVua051bWJlcik7Ci0gICAgICAgICAgICBmaXJzdENo
dW5rTnVtYmVyICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgbGFzdENodW5rTnVtYmVy
ID0gdGhpcy5fdGV4dENodW5rcy5sZW5ndGg7Ci0gICAgICAgIGlmIChlbmRMaW5lICE9PSB0aGlz
Ll90ZXh0TW9kZWwubGluZXNDb3VudCkgewotICAgICAgICAgICAgbGFzdENodW5rTnVtYmVyID0g
dGhpcy5fY2h1bmtOdW1iZXJGb3JMaW5lKGVuZExpbmUpOwotICAgICAgICAgICAgdmFyIGxhc3RD
aHVuayA9IHRoaXMuX3RleHRDaHVua3NbbGFzdENodW5rTnVtYmVyXTsKLSAgICAgICAgICAgIGlm
IChsYXN0Q2h1bmsgJiYgbGFzdENodW5rLnN0YXJ0TGluZSAhPT0gZW5kTGluZSkgewotICAgICAg
ICAgICAgICAgIHRoaXMuX3NwbGl0Q2h1bmtPbkFMaW5lKGVuZExpbmUsIGxhc3RDaHVua051bWJl
cik7Ci0gICAgICAgICAgICAgICAgbGFzdENodW5rTnVtYmVyICs9IDE7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKHZhciBjaHVua051bWJlciA9IDA7IGNodW5rTnVt
YmVyIDwgZmlyc3RDaHVua051bWJlcjsgKytjaHVua051bWJlcikKLSAgICAgICAgICAgIHRoaXMu
X3RleHRDaHVua3NbY2h1bmtOdW1iZXJdLnJlYWRPbmx5ID0gdHJ1ZTsKLSAgICAgICAgZm9yICh2
YXIgY2h1bmtOdW1iZXIgPSBmaXJzdENodW5rTnVtYmVyOyBjaHVua051bWJlciA8IGxhc3RDaHVu
a051bWJlcjsgKytjaHVua051bWJlcikKLSAgICAgICAgICAgIHRoaXMuX3RleHRDaHVua3NbY2h1
bmtOdW1iZXJdLnJlYWRPbmx5ID0gZmFsc2U7Ci0gICAgICAgIGZvciAodmFyIGNodW5rTnVtYmVy
ID0gbGFzdENodW5rTnVtYmVyOyBjaHVua051bWJlciA8IHRoaXMuX3RleHRDaHVua3MubGVuZ3Ro
OyArK2NodW5rTnVtYmVyKQotICAgICAgICAgICAgdGhpcy5fdGV4dENodW5rc1tjaHVua051bWJl
cl0ucmVhZE9ubHkgPSB0cnVlOwotCi0gICAgICAgIHRoaXMuZW5kRG9tVXBkYXRlcygpOwotICAg
IH0sCi0KLSAgICBjbGVhckVkaXRhYmxlUmFuZ2U6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAg
IGZvciAodmFyIGNodW5rTnVtYmVyID0gMDsgY2h1bmtOdW1iZXIgPCB0aGlzLl90ZXh0Q2h1bmtz
Lmxlbmd0aDsgKytjaHVua051bWJlcikKLSAgICAgICAgICAgIHRoaXMuX3RleHRDaHVua3NbY2h1
bmtOdW1iZXJdLnJlYWRPbmx5ID0gZmFsc2U7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBw
YXJhbSB7V2ViSW5zcGVjdG9yLlRleHRSYW5nZX0gcmFuZ2UKLSAgICAgKi8KLSAgICBtYXJrQW5k
UmV2ZWFsUmFuZ2U6IGZ1bmN0aW9uKHJhbmdlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuX3Jh
bmdlVG9NYXJrKSB7Ci0gICAgICAgICAgICB2YXIgbWFya2VkTGluZSA9IHRoaXMuX3JhbmdlVG9N
YXJrLnN0YXJ0TGluZTsKLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yYW5nZVRvTWFyazsKLSAg
ICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbWFya2VkIHJlZ2lvbiBpbW1lZGlhdGVseS4KLSAgICAg
ICAgICAgIGlmICghdGhpcy5fZGlydHlMaW5lcykgewotICAgICAgICAgICAgICAgIHRoaXMuYmVn
aW5Eb21VcGRhdGVzKCk7Ci0gICAgICAgICAgICAgICAgdmFyIGNodW5rID0gdGhpcy5jaHVua0Zv
ckxpbmUobWFya2VkTGluZSk7Ci0gICAgICAgICAgICAgICAgdmFyIHdhc0V4cGFuZGVkID0gY2h1
bmsuZXhwYW5kZWQ7Ci0gICAgICAgICAgICAgICAgY2h1bmsuZXhwYW5kZWQgPSBmYWxzZTsKLSAg
ICAgICAgICAgICAgICBjaHVuay51cGRhdGVDb2xsYXBzZWRMaW5lUm93KCk7Ci0gICAgICAgICAg
ICAgICAgY2h1bmsuZXhwYW5kZWQgPSB3YXNFeHBhbmRlZDsKLSAgICAgICAgICAgICAgICB0aGlz
LmVuZERvbVVwZGF0ZXMoKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHRo
aXMuX3BhaW50TGluZXMobWFya2VkTGluZSwgbWFya2VkTGluZSArIDEpOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKHJhbmdlKSB7Ci0gICAgICAgICAgICB0aGlzLl9yYW5nZVRvTWFyayA9IHJh
bmdlOwotICAgICAgICAgICAgdGhpcy5yZXZlYWxMaW5lKHJhbmdlLnN0YXJ0TGluZSk7Ci0gICAg
ICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLm1ha2VMaW5lQUNodW5rKHJhbmdlLnN0YXJ0TGluZSk7
Ci0gICAgICAgICAgICB0aGlzLl9wYWludExpbmUoY2h1bmsuZWxlbWVudCk7Ci0gICAgICAgICAg
ICBpZiAodGhpcy5fbWFya2VkUmFuZ2VFbGVtZW50KQotICAgICAgICAgICAgICAgIHRoaXMuX21h
cmtlZFJhbmdlRWxlbWVudC5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7Ci0gICAgICAgIH0KLSAg
ICAgICAgZGVsZXRlIHRoaXMuX21hcmtlZFJhbmdlRWxlbWVudDsKLSAgICB9LAotCi0gICAgLyoq
Ci0gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIKLSAgICAgKi8KLSAgICBoaWdobGln
aHRMaW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGVhckxp
bmVIaWdobGlnaHQoKTsKLSAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZWRMaW5lID0gbGluZU51bWJl
cjsKLSAgICAgICAgdGhpcy5yZXZlYWxMaW5lKGxpbmVOdW1iZXIpOwotCi0gICAgICAgIGlmICgh
dGhpcy5fcmVhZE9ubHkpCi0gICAgICAgICAgICB0aGlzLl9yZXN0b3JlU2VsZWN0aW9uKFdlYklu
c3BlY3Rvci5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKGxpbmVOdW1iZXIsIDApLCBmYWxz
ZSk7Ci0KLSAgICAgICAgdGhpcy5hZGREZWNvcmF0aW9uKGxpbmVOdW1iZXIsICJ3ZWJraXQtaGln
aGxpZ2h0ZWQtbGluZSIpOwotICAgIH0sCi0KLSAgICBjbGVhckxpbmVIaWdobGlnaHQ6IGZ1bmN0
aW9uKCkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlb2YgdGhpcy5faGlnaGxpZ2h0ZWRMaW5lID09
PSAibnVtYmVyIikgewotICAgICAgICAgICAgdGhpcy5yZW1vdmVEZWNvcmF0aW9uKHRoaXMuX2hp
Z2hsaWdodGVkTGluZSwgIndlYmtpdC1oaWdobGlnaHRlZC1saW5lIik7Ci0gICAgICAgICAgICBk
ZWxldGUgdGhpcy5faGlnaGxpZ2h0ZWRMaW5lOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGZy
ZWVDYWNoZWRFbGVtZW50czogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdGhpcy5fY2FjaGVk
U3BhbnMgPSBbXTsKLSAgICAgICAgdGhpcy5fY2FjaGVkVGV4dE5vZGVzID0gW107Ci0gICAgICAg
IHRoaXMuX2NhY2hlZFJvd3MgPSBbXTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHBhcmFt
IHtib29sZWFufSByZWRvCi0gICAgICovCi0gICAgaGFuZGxlVW5kb1JlZG86IGZ1bmN0aW9uKHJl
ZG8pCi0gICAgewotICAgICAgICBpZiAodGhpcy5fZGlydHlMaW5lcykKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgICAgICB0aGlzLmJlZ2luVXBkYXRlcygpOwotCi0gICAgICAgIGZ1
bmN0aW9uIGJlZm9yZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuX2VudGVyVGV4dENo
YW5nZU1vZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIGFmdGVyKG9sZFJhbmdl
LCBuZXdSYW5nZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5fZXhpdFRleHRDaGFuZ2VN
b2RlKG9sZFJhbmdlLCBuZXdSYW5nZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgcmFuZ2Ug
PSByZWRvID8gdGhpcy5fdGV4dE1vZGVsLnJlZG8oYmVmb3JlLmJpbmQodGhpcyksIGFmdGVyLmJp
bmQodGhpcykpIDogdGhpcy5fdGV4dE1vZGVsLnVuZG8oYmVmb3JlLmJpbmQodGhpcyksIGFmdGVy
LmJpbmQodGhpcykpOwotCi0gICAgICAgIHRoaXMuZW5kVXBkYXRlcygpOwotCi0gICAgICAgIC8v
IFJlc3RvcmUgbG9jYXRpb24gcG9zdC1yZXBhaW50LgotICAgICAgICBpZiAocmFuZ2UpCi0gICAg
ICAgICAgICB0aGlzLl9yZXN0b3JlU2VsZWN0aW9uKHJhbmdlLCB0cnVlKTsKLQotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHtib29sZWFufSBz
aGlmdEtleQotICAgICAqLwotICAgIGhhbmRsZVRhYktleVByZXNzOiBmdW5jdGlvbihzaGlmdEtl
eSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLl9kaXJ0eUxpbmVzKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWxlY3Rpb24o
KTsKLSAgICAgICAgaWYgKCFzZWxlY3Rpb24pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAgICAgdmFyIHJhbmdlID0gc2VsZWN0aW9uLm5vcm1hbGl6ZSgpOwotCi0gICAgICAgIHRo
aXMuYmVnaW5VcGRhdGVzKCk7Ci0gICAgICAgIHRoaXMuX2VudGVyVGV4dENoYW5nZU1vZGUoKTsK
LQotICAgICAgICB2YXIgbmV3UmFuZ2U7Ci0gICAgICAgIHZhciByYW5nZVdhc0VtcHR5ID0gcmFu
Z2UuaXNFbXB0eSgpOwotICAgICAgICBpZiAoc2hpZnRLZXkpCi0gICAgICAgICAgICBuZXdSYW5n
ZSA9IHRoaXMuX3VuaW5kZW50TGluZXMocmFuZ2UpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAg
ICAgIGlmIChyYW5nZVdhc0VtcHR5KQotICAgICAgICAgICAgICAgIG5ld1JhbmdlID0gdGhpcy5f
ZWRpdFJhbmdlKHJhbmdlLCBXZWJJbnNwZWN0b3Iuc2V0dGluZ3MudGV4dEVkaXRvckluZGVudC5n
ZXQoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbmV3UmFuZ2UgPSB0aGlz
Ll9pbmRlbnRMaW5lcyhyYW5nZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLl9leGl0VGV4
dENoYW5nZU1vZGUocmFuZ2UsIG5ld1JhbmdlKTsKLSAgICAgICAgdGhpcy5lbmRVcGRhdGVzKCk7
Ci0gICAgICAgIGlmIChyYW5nZVdhc0VtcHR5KQotICAgICAgICAgICAgbmV3UmFuZ2Uuc3RhcnRD
b2x1bW4gPSBuZXdSYW5nZS5lbmRDb2x1bW47Ci0gICAgICAgIHRoaXMuX3Jlc3RvcmVTZWxlY3Rp
b24obmV3UmFuZ2UsIHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9LAotCi0gICAg
LyoqCi0gICAgICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSByYW5nZQotICAgICAq
LwotICAgIF9pbmRlbnRMaW5lczogZnVuY3Rpb24ocmFuZ2UpCi0gICAgewotICAgICAgICB2YXIg
aW5kZW50ID0gV2ViSW5zcGVjdG9yLnNldHRpbmdzLnRleHRFZGl0b3JJbmRlbnQuZ2V0KCk7Ci0K
LSAgICAgICAgaWYgKHRoaXMuX2xhc3RFZGl0ZWRSYW5nZSkKLSAgICAgICAgICAgIHRoaXMuX3Rl
eHRNb2RlbC5tYXJrVW5kb2FibGVTdGF0ZSgpOwotCi0gICAgICAgIHZhciBuZXdSYW5nZSA9IHJh
bmdlLmNsb25lKCk7Ci0KLSAgICAgICAgLy8gRG8gbm90IGNoYW5nZSBhIHNlbGVjdGlvbiBzdGFy
dCBwb3NpdGlvbiB3aGVuIGl0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAgICAg
IGlmIChyYW5nZS5zdGFydENvbHVtbikKLSAgICAgICAgICAgIG5ld1JhbmdlLnN0YXJ0Q29sdW1u
ICs9IGluZGVudC5sZW5ndGg7Ci0KLSAgICAgICAgdmFyIGluZGVudEVuZExpbmUgPSByYW5nZS5l
bmRMaW5lOwotICAgICAgICBpZiAocmFuZ2UuZW5kQ29sdW1uKQotICAgICAgICAgICAgbmV3UmFu
Z2UuZW5kQ29sdW1uICs9IGluZGVudC5sZW5ndGg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IGluZGVudEVuZExpbmUtLTsKLQotICAgICAgICBmb3IgKHZhciBsaW5lTnVtYmVyID0gcmFuZ2Uu
c3RhcnRMaW5lOyBsaW5lTnVtYmVyIDw9IGluZGVudEVuZExpbmU7IGxpbmVOdW1iZXIrKykKLSAg
ICAgICAgICAgIHRoaXMuX3RleHRNb2RlbC5lZGl0UmFuZ2UoV2ViSW5zcGVjdG9yLlRleHRSYW5n
ZS5jcmVhdGVGcm9tTG9jYXRpb24obGluZU51bWJlciwgMCksIGluZGVudCk7Ci0KLSAgICAgICAg
dGhpcy5fbGFzdEVkaXRlZFJhbmdlID0gbmV3UmFuZ2U7Ci0KLSAgICAgICAgcmV0dXJuIG5ld1Jh
bmdlOwotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ge1dlYkluc3BlY3Rvci5UZXh0
UmFuZ2V9IHJhbmdlCi0gICAgICovCi0gICAgX3VuaW5kZW50TGluZXM6IGZ1bmN0aW9uKHJhbmdl
KQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuX2xhc3RFZGl0ZWRSYW5nZSkKLSAgICAgICAgICAg
IHRoaXMuX3RleHRNb2RlbC5tYXJrVW5kb2FibGVTdGF0ZSgpOwotCi0gICAgICAgIHZhciBpbmRl
bnQgPSBXZWJJbnNwZWN0b3Iuc2V0dGluZ3MudGV4dEVkaXRvckluZGVudC5nZXQoKTsKLSAgICAg
ICAgdmFyIGluZGVudExlbmd0aCA9IGluZGVudCA9PT0gV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JN
b2RlbC5JbmRlbnQuVGFiQ2hhcmFjdGVyID8gNCA6IGluZGVudC5sZW5ndGg7Ci0gICAgICAgIHZh
ciBsaW5lSW5kZW50UmVnZXggPSBuZXcgUmVnRXhwKCJeIHsxLCIgKyBpbmRlbnRMZW5ndGggKyAi
fSIpOwotICAgICAgICB2YXIgbmV3UmFuZ2UgPSByYW5nZS5jbG9uZSgpOwotCi0gICAgICAgIHZh
ciBpbmRlbnRFbmRMaW5lID0gcmFuZ2UuZW5kTGluZTsKLSAgICAgICAgaWYgKCFyYW5nZS5lbmRD
b2x1bW4pCi0gICAgICAgICAgICBpbmRlbnRFbmRMaW5lLS07Ci0KLSAgICAgICAgZm9yICh2YXIg
bGluZU51bWJlciA9IHJhbmdlLnN0YXJ0TGluZTsgbGluZU51bWJlciA8PSBpbmRlbnRFbmRMaW5l
OyBsaW5lTnVtYmVyKyspIHsKLSAgICAgICAgICAgIHZhciBsaW5lID0gdGhpcy5fdGV4dE1vZGVs
LmxpbmUobGluZU51bWJlcik7Ci0gICAgICAgICAgICB2YXIgZmlyc3RDaGFyYWN0ZXIgPSBsaW5l
LmNoYXJBdCgwKTsKLSAgICAgICAgICAgIHZhciBsaW5lSW5kZW50TGVuZ3RoOwotCi0gICAgICAg
ICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09ICIgIikKLSAgICAgICAgICAgICAgICBsaW5lSW5k
ZW50TGVuZ3RoID0gbGluZS5tYXRjaChsaW5lSW5kZW50UmVnZXgpWzBdLmxlbmd0aDsKLSAgICAg
ICAgICAgIGVsc2UgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAiXHQiKQotICAgICAgICAgICAgICAg
IGxpbmVJbmRlbnRMZW5ndGggPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwotCi0gICAgICAgICAgICB0aGlzLl90ZXh0TW9kZWwuZWRpdFJhbmdlKG5ldyBX
ZWJJbnNwZWN0b3IuVGV4dFJhbmdlKGxpbmVOdW1iZXIsIDAsIGxpbmVOdW1iZXIsIGxpbmVJbmRl
bnRMZW5ndGgpLCAiIik7Ci0KLSAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyID09PSByYW5nZS5z
dGFydExpbmUpCi0gICAgICAgICAgICAgICAgbmV3UmFuZ2Uuc3RhcnRDb2x1bW4gPSBNYXRoLm1h
eCgwLCBuZXdSYW5nZS5zdGFydENvbHVtbiAtIGxpbmVJbmRlbnRMZW5ndGgpOwotICAgICAgICB9
Ci0KLSAgICAgICAgaWYgKGxpbmVJbmRlbnRMZW5ndGgpCi0gICAgICAgICAgICBuZXdSYW5nZS5l
bmRDb2x1bW4gPSBNYXRoLm1heCgwLCBuZXdSYW5nZS5lbmRDb2x1bW4gLSBsaW5lSW5kZW50TGVu
Z3RoKTsKLQotICAgICAgICB0aGlzLl9sYXN0RWRpdGVkUmFuZ2UgPSBuZXdSYW5nZTsKLQotICAg
ICAgICByZXR1cm4gbmV3UmFuZ2U7Ci0gICAgfSwKLQotICAgIGhhbmRsZUVudGVyS2V5OiBmdW5j
dGlvbigpCi0gICAgewotICAgICAgICBpZiAodGhpcy5fZGlydHlMaW5lcykKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLl9nZXRTZWxlY3Rpb24o
KTsKLSAgICAgICAgaWYgKCFyYW5nZSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
ICAgICByYW5nZSA9IHJhbmdlLm5vcm1hbGl6ZSgpOwotCi0gICAgICAgIGlmIChyYW5nZS5lbmRD
b2x1bW4gPT09IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgdmFyIGxp
bmUgPSB0aGlzLl90ZXh0TW9kZWwubGluZShyYW5nZS5zdGFydExpbmUpOwotICAgICAgICB2YXIg
bGluZVByZWZpeCA9IGxpbmUuc3Vic3RyaW5nKDAsIHJhbmdlLnN0YXJ0Q29sdW1uKTsKLSAgICAg
ICAgdmFyIGluZGVudE1hdGNoID0gbGluZVByZWZpeC5tYXRjaCgvXlxzKy8pOwotICAgICAgICB2
YXIgY3VycmVudEluZGVudCA9IGluZGVudE1hdGNoID8gaW5kZW50TWF0Y2hbMF0gOiAiIjsKLQot
ICAgICAgICB2YXIgdGV4dEVkaXRvckluZGVudCA9IFdlYkluc3BlY3Rvci5zZXR0aW5ncy50ZXh0
RWRpdG9ySW5kZW50LmdldCgpOwotICAgICAgICB2YXIgaW5kZW50ID0gV2ViSW5zcGVjdG9yLlRl
eHRFZGl0b3JNb2RlbC5lbmRzV2l0aEJyYWNrZXRSZWdleC50ZXN0KGxpbmVQcmVmaXgpID8gY3Vy
cmVudEluZGVudCArIHRleHRFZGl0b3JJbmRlbnQgOiBjdXJyZW50SW5kZW50OwotCi0gICAgICAg
IGlmICghaW5kZW50KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHRoaXMu
YmVnaW5VcGRhdGVzKCk7Ci0gICAgICAgIHRoaXMuX2VudGVyVGV4dENoYW5nZU1vZGUoKTsKLQot
ICAgICAgICB2YXIgbGluZUJyZWFrID0gdGhpcy5fdGV4dE1vZGVsLmxpbmVCcmVhazsKLSAgICAg
ICAgdmFyIG5ld1JhbmdlOwotICAgICAgICBpZiAocmFuZ2UuaXNFbXB0eSgpICYmIGxpbmUuc3Vi
c3RyKHJhbmdlLmVuZENvbHVtbiAtIDEsIDIpID09PSAne30nKSB7Ci0gICAgICAgICAgICAvLyB7
fH0KLSAgICAgICAgICAgIC8vIGJlY29tZXMKLSAgICAgICAgICAgIC8vIHsKLSAgICAgICAgICAg
IC8vICAgICB8Ci0gICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICBuZXdSYW5nZSA9IHRoaXMu
X2VkaXRSYW5nZShyYW5nZSwgbGluZUJyZWFrICsgaW5kZW50ICsgbGluZUJyZWFrICsgY3VycmVu
dEluZGVudCk7Ci0gICAgICAgICAgICBuZXdSYW5nZS5lbmRMaW5lLS07Ci0gICAgICAgICAgICBu
ZXdSYW5nZS5lbmRDb2x1bW4gKz0gdGV4dEVkaXRvckluZGVudC5sZW5ndGg7Ci0gICAgICAgIH0g
ZWxzZQotICAgICAgICAgICAgbmV3UmFuZ2UgPSB0aGlzLl9lZGl0UmFuZ2UocmFuZ2UsIGxpbmVC
cmVhayArIGluZGVudCk7Ci0KLSAgICAgICAgdGhpcy5fZXhpdFRleHRDaGFuZ2VNb2RlKHJhbmdl
LCBuZXdSYW5nZSk7Ci0gICAgICAgIHRoaXMuZW5kVXBkYXRlcygpOwotICAgICAgICB0aGlzLl9y
ZXN0b3JlU2VsZWN0aW9uKG5ld1JhbmdlLmNvbGxhcHNlVG9FbmQoKSwgdHJ1ZSk7Ci0KLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7bnVtYmVy
fSBsaW5lTnVtYmVyCi0gICAgICogQHBhcmFtIHtudW1iZXJ9IGNodW5rTnVtYmVyCi0gICAgICog
QHBhcmFtIHtib29sZWFuPX0gY3JlYXRlU3VmZml4Q2h1bmsKLSAgICAgKi8KLSAgICBfc3BsaXRD
aHVua09uQUxpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIsIGNodW5rTnVtYmVyLCBjcmVhdGVTdWZm
aXhDaHVuaykKLSAgICB7Ci0gICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWxlY3Rp
b24oKTsKLSAgICAgICAgdmFyIGNodW5rID0gV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2Vk
UGFuZWwucHJvdG90eXBlLl9zcGxpdENodW5rT25BTGluZS5jYWxsKHRoaXMsIGxpbmVOdW1iZXIs
IGNodW5rTnVtYmVyLCBjcmVhdGVTdWZmaXhDaHVuayk7Ci0gICAgICAgIHRoaXMuX3Jlc3RvcmVT
ZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgICAgcmV0dXJuIGNodW5rOwotICAgIH0sCi0KLSAg
ICBiZWdpbkRvbVVwZGF0ZXM6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIFdlYkluc3BlY3Rv
ci5UZXh0RWRpdG9yQ2h1bmtlZFBhbmVsLnByb3RvdHlwZS5iZWdpbkRvbVVwZGF0ZXMuY2FsbCh0
aGlzKTsKLSAgICAgICAgaWYgKHRoaXMuX2RvbVVwZGF0ZUNvYWxlc2NpbmdMZXZlbCA9PT0gMSkg
ewotICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNo
YXJhY3RlckRhdGFNb2RpZmllZCIsIHRoaXMuX2hhbmRsZURPTVVwZGF0ZXNDYWxsYmFjaywgZmFs
c2UpOwotICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRP
TU5vZGVJbnNlcnRlZCIsIHRoaXMuX2hhbmRsZURPTVVwZGF0ZXNDYWxsYmFjaywgZmFsc2UpOwot
ICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTVN1YnRy
ZWVNb2RpZmllZCIsIHRoaXMuX2hhbmRsZURPTVVwZGF0ZXNDYWxsYmFjaywgZmFsc2UpOwotICAg
ICAgICB9Ci0gICAgfSwKLQotICAgIGVuZERvbVVwZGF0ZXM6IGZ1bmN0aW9uKCkKLSAgICB7Ci0g
ICAgICAgIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yQ2h1bmtlZFBhbmVsLnByb3RvdHlwZS5lbmRE
b21VcGRhdGVzLmNhbGwodGhpcyk7Ci0gICAgICAgIGlmICh0aGlzLl9kb21VcGRhdGVDb2FsZXNj
aW5nTGV2ZWwgPT09IDApIHsKLSAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5hZGRFdmVudExp
c3RlbmVyKCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQiLCB0aGlzLl9oYW5kbGVET01VcGRhdGVz
Q2FsbGJhY2ssIGZhbHNlKTsKLSAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5hZGRFdmVudExp
c3RlbmVyKCJET01Ob2RlSW5zZXJ0ZWQiLCB0aGlzLl9oYW5kbGVET01VcGRhdGVzQ2FsbGJhY2ss
IGZhbHNlKTsKLSAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJE
T01TdWJ0cmVlTW9kaWZpZWQiLCB0aGlzLl9oYW5kbGVET01VcGRhdGVzQ2FsbGJhY2ssIGZhbHNl
KTsKLSAgICAgICAgfQotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ge0VsZW1lbnR9
IGxpbmVSb3cKLSAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZQotICAgICAqLwotICAgIF9l
bmFibGVET01Ob2RlUmVtb3ZlZExpc3RlbmVyOiBmdW5jdGlvbihsaW5lUm93LCBlbmFibGUpCi0g
ICAgewotICAgICAgICBpZiAoZW5hYmxlKQotICAgICAgICAgICAgbGluZVJvdy5hZGRFdmVudExp
c3RlbmVyKCJET01Ob2RlUmVtb3ZlZCIsIHRoaXMuX2hhbmRsZURPTVVwZGF0ZXNDYWxsYmFjaywg
ZmFsc2UpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsaW5lUm93LnJlbW92ZUV2ZW50TGlz
dGVuZXIoIkRPTU5vZGVSZW1vdmVkIiwgdGhpcy5faGFuZGxlRE9NVXBkYXRlc0NhbGxiYWNrLCBm
YWxzZSk7Ci0gICAgfSwKLQotICAgIF9idWlsZENodW5rczogZnVuY3Rpb24oKQotICAgIHsKLSAg
ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl90ZXh0TW9kZWwubGluZXNDb3VudDsgKytp
KQotICAgICAgICAgICAgdGhpcy5fdGV4dE1vZGVsLnJlbW92ZUF0dHJpYnV0ZShpLCAiaGlnaGxp
Z2h0Iik7Ci0KLSAgICAgICAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2VkUGFuZWwucHJv
dG90eXBlLl9idWlsZENodW5rcy5jYWxsKHRoaXMpOwotICAgIH0sCi0KLSAgICAvKioKLSAgICAg
KiBAcGFyYW0ge251bWJlcn0gc3RhcnRMaW5lCi0gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZExp
bmUKLSAgICAgKi8KLSAgICBfY3JlYXRlTmV3Q2h1bms6IGZ1bmN0aW9uKHN0YXJ0TGluZSwgZW5k
TGluZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JN
YWluQ2h1bmsodGhpcywgc3RhcnRMaW5lLCBlbmRMaW5lKTsKLSAgICB9LAotCi0gICAgLyoqCi0g
ICAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleAotICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0
b0luZGV4Ci0gICAgICovCi0gICAgX2V4cGFuZENodW5rczogZnVuY3Rpb24oZnJvbUluZGV4LCB0
b0luZGV4KQotICAgIHsKLSAgICAgICAgdmFyIGxhc3RDaHVuayA9IHRoaXMuX3RleHRDaHVua3Nb
dG9JbmRleCAtIDFdOwotICAgICAgICB2YXIgbGFzdFZpc2libGVMaW5lID0gbGFzdENodW5rLnN0
YXJ0TGluZSArIGxhc3RDaHVuay5saW5lc0NvdW50OwotCi0gICAgICAgIHZhciBzZWxlY3Rpb24g
PSB0aGlzLl9nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICB0aGlzLl9tdXRlSGlnaGxpZ2h0TGlz
dGVuZXIgPSB0cnVlOwotICAgICAgICB0aGlzLl9oaWdobGlnaHRlci5oaWdobGlnaHQobGFzdFZp
c2libGVMaW5lKTsKLSAgICAgICAgZGVsZXRlIHRoaXMuX211dGVIaWdobGlnaHRMaXN0ZW5lcjsK
LQotICAgICAgICB0aGlzLl9yZXN0b3JlUGFpbnRMaW5lc09wZXJhdGlvbnNDcmVkaXQoKTsKLSAg
ICAgICAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2VkUGFuZWwucHJvdG90eXBlLl9leHBh
bmRDaHVua3MuY2FsbCh0aGlzLCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotICAgICAgICB0aGlzLl9h
ZGp1c3RQYWludExpbmVzT3BlcmF0aW9uc1JlZnJlc2hWYWx1ZSgpOwotCi0gICAgICAgIHRoaXMu
X3Jlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICog
QHBhcmFtIHtudW1iZXJ9IGZyb21MaW5lCi0gICAgICogQHBhcmFtIHtudW1iZXJ9IHRvTGluZQot
ICAgICAqLwotICAgIF9oaWdobGlnaHREYXRhUmVhZHk6IGZ1bmN0aW9uKGZyb21MaW5lLCB0b0xp
bmUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5fbXV0ZUhpZ2hsaWdodExpc3RlbmVyKQotICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB0aGlzLl9yZXN0b3JlUGFpbnRMaW5lc09wZXJhdGlv
bnNDcmVkaXQoKTsKLSAgICAgICAgdGhpcy5fcGFpbnRMaW5lcyhmcm9tTGluZSwgdG9MaW5lLCB0
cnVlIC8qcmVzdG9yZVNlbGVjdGlvbiovKTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHBh
cmFtIHtudW1iZXJ9IHN0YXJ0TGluZQotICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmRMaW5lCi0g
ICAgICovCi0gICAgX3NjaGVkdWxlUGFpbnRMaW5lczogZnVuY3Rpb24oc3RhcnRMaW5lLCBlbmRM
aW5lKQotICAgIHsKLSAgICAgICAgaWYgKHN0YXJ0TGluZSA+PSBlbmRMaW5lKQotICAgICAgICAg
ICAgcmV0dXJuOwotCi0gICAgICAgIGlmICghdGhpcy5fc2NoZWR1bGVkUGFpbnRMaW5lcykgewot
ICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVkUGFpbnRMaW5lcyA9IFsgeyBzdGFydExpbmU6IHN0
YXJ0TGluZSwgZW5kTGluZTogZW5kTGluZSB9IF07Ci0gICAgICAgICAgICB0aGlzLl9wYWludFNj
aGVkdWxlZExpbmVzVGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuX3BhaW50U2NoZWR1bGVkTGluZXMu
YmluZCh0aGlzKSwgMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKHZhciBp
ID0gMDsgaSA8IHRoaXMuX3NjaGVkdWxlZFBhaW50TGluZXMubGVuZ3RoOyArK2kpIHsKLSAgICAg
ICAgICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLl9zY2hlZHVsZWRQYWludExpbmVzW2ldOwotICAg
ICAgICAgICAgICAgIGlmIChjaHVuay5zdGFydExpbmUgPD0gZW5kTGluZSAmJiBjaHVuay5lbmRM
aW5lID49IHN0YXJ0TGluZSkgewotICAgICAgICAgICAgICAgICAgICBjaHVuay5zdGFydExpbmUg
PSBNYXRoLm1pbihjaHVuay5zdGFydExpbmUsIHN0YXJ0TGluZSk7Ci0gICAgICAgICAgICAgICAg
ICAgIGNodW5rLmVuZExpbmUgPSBNYXRoLm1heChjaHVuay5lbmRMaW5lLCBlbmRMaW5lKTsKLSAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICBpZiAoY2h1bmsuc3RhcnRMaW5lID4gZW5kTGluZSkgewotICAgICAgICAgICAgICAgICAg
ICB0aGlzLl9zY2hlZHVsZWRQYWludExpbmVzLnNwbGljZShpLCAwLCB7IHN0YXJ0TGluZTogc3Rh
cnRMaW5lLCBlbmRMaW5lOiBlbmRMaW5lIH0pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5fc2No
ZWR1bGVkUGFpbnRMaW5lcy5wdXNoKHsgc3RhcnRMaW5lOiBzdGFydExpbmUsIGVuZExpbmU6IGVu
ZExpbmUgfSk7Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHti
b29sZWFufSBza2lwUmVzdG9yZVNlbGVjdGlvbgotICAgICAqLwotICAgIF9wYWludFNjaGVkdWxl
ZExpbmVzOiBmdW5jdGlvbihza2lwUmVzdG9yZVNlbGVjdGlvbikKLSAgICB7Ci0gICAgICAgIGlm
ICh0aGlzLl9wYWludFNjaGVkdWxlZExpbmVzVGltZXIpCi0gICAgICAgICAgICBjbGVhclRpbWVv
dXQodGhpcy5fcGFpbnRTY2hlZHVsZWRMaW5lc1RpbWVyKTsKLSAgICAgICAgZGVsZXRlIHRoaXMu
X3BhaW50U2NoZWR1bGVkTGluZXNUaW1lcjsKLQotICAgICAgICBpZiAoIXRoaXMuX3NjaGVkdWxl
ZFBhaW50TGluZXMpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gUmVzY2hlZHVs
ZSB0aGUgdGltZXIgaWYgd2UgY2FuIG5vdCBwYWludCB0aGUgbGluZXMgeWV0LCBvciB0aGUgdXNl
ciBpcyBzY3JvbGxpbmcuCi0gICAgICAgIGlmICh0aGlzLl9kaXJ0eUxpbmVzIHx8IHRoaXMuX3Jl
cGFpbnRBbGxUaW1lcikgewotICAgICAgICAgICAgdGhpcy5fcGFpbnRTY2hlZHVsZWRMaW5lc1Rp
bWVyID0gc2V0VGltZW91dCh0aGlzLl9wYWludFNjaGVkdWxlZExpbmVzLmJpbmQodGhpcyksIDUw
KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciBzY2hlZHVs
ZWRQYWludExpbmVzID0gdGhpcy5fc2NoZWR1bGVkUGFpbnRMaW5lczsKLSAgICAgICAgZGVsZXRl
IHRoaXMuX3NjaGVkdWxlZFBhaW50TGluZXM7Ci0KLSAgICAgICAgdGhpcy5fcmVzdG9yZVBhaW50
TGluZXNPcGVyYXRpb25zQ3JlZGl0KCk7Ci0gICAgICAgIHRoaXMuX3BhaW50TGluZUNodW5rcyhz
Y2hlZHVsZWRQYWludExpbmVzLCAhc2tpcFJlc3RvcmVTZWxlY3Rpb24pOwotICAgICAgICB0aGlz
Ll9hZGp1c3RQYWludExpbmVzT3BlcmF0aW9uc1JlZnJlc2hWYWx1ZSgpOwotICAgIH0sCi0KLSAg
ICBfcmVzdG9yZVBhaW50TGluZXNPcGVyYXRpb25zQ3JlZGl0OiBmdW5jdGlvbigpCi0gICAgewot
ICAgICAgICBpZiAoIXRoaXMuX3BhaW50TGluZXNPcGVyYXRpb25zUmVmcmVzaFZhbHVlKQotICAg
ICAgICAgICAgdGhpcy5fcGFpbnRMaW5lc09wZXJhdGlvbnNSZWZyZXNoVmFsdWUgPSAyNTA7Ci0g
ICAgICAgIHRoaXMuX3BhaW50TGluZXNPcGVyYXRpb25zQ3JlZGl0ID0gdGhpcy5fcGFpbnRMaW5l
c09wZXJhdGlvbnNSZWZyZXNoVmFsdWU7Ci0gICAgICAgIHRoaXMuX3BhaW50TGluZXNPcGVyYXRp
b25zTGFzdFJlZnJlc2ggPSBEYXRlLm5vdygpOwotICAgIH0sCi0KLSAgICBfYWRqdXN0UGFpbnRM
aW5lc09wZXJhdGlvbnNSZWZyZXNoVmFsdWU6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHZh
ciBvcGVyYXRpb25zRG9uZSA9IHRoaXMuX3BhaW50TGluZXNPcGVyYXRpb25zUmVmcmVzaFZhbHVl
IC0gdGhpcy5fcGFpbnRMaW5lc09wZXJhdGlvbnNDcmVkaXQ7Ci0gICAgICAgIGlmIChvcGVyYXRp
b25zRG9uZSA8PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB2YXIgdGltZVBhc3Qg
PSBEYXRlLm5vdygpIC0gdGhpcy5fcGFpbnRMaW5lc09wZXJhdGlvbnNMYXN0UmVmcmVzaDsKLSAg
ICAgICAgaWYgKHRpbWVQYXN0IDw9IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8v
IE1ha2UgdGhlIHN5bmNocm9ub3VzIENQVSBjaHVuayBmb3IgcGFpbnRpbmcgdGhlIGxpbmVzIDUw
IG1zZWMuCi0gICAgICAgIHZhciB2YWx1ZSA9IE1hdGguZmxvb3Iob3BlcmF0aW9uc0RvbmUgLyB0
aW1lUGFzdCAqIDUwKTsKLSAgICAgICAgdGhpcy5fcGFpbnRMaW5lc09wZXJhdGlvbnNSZWZyZXNo
VmFsdWUgPSBOdW1iZXIuY29uc3RyYWluKHZhbHVlLCAxNTAsIDE1MDApOwotICAgIH0sCi0KLSAg
ICAvKioKLSAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUxpbmUKLSAgICAgKiBAcGFyYW0ge251
bWJlcn0gdG9MaW5lCi0gICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVzdG9yZVNlbGVjdGlvbgot
ICAgICAqLwotICAgIF9wYWludExpbmVzOiBmdW5jdGlvbihmcm9tTGluZSwgdG9MaW5lLCByZXN0
b3JlU2VsZWN0aW9uKQotICAgIHsKLSAgICAgICAgdGhpcy5fcGFpbnRMaW5lQ2h1bmtzKFsgeyBz
dGFydExpbmU6IGZyb21MaW5lLCBlbmRMaW5lOiB0b0xpbmUgfSBdLCByZXN0b3JlU2VsZWN0aW9u
KTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVzdG9yZVNl
bGVjdGlvbgotICAgICAqLwotICAgIF9wYWludExpbmVDaHVua3M6IGZ1bmN0aW9uKGxpbmVDaHVu
a3MsIHJlc3RvcmVTZWxlY3Rpb24pCi0gICAgewotICAgICAgICAvLyBGaXJzdCwgcGFpbnQgdmlz
aWJsZSBsaW5lcywgc28gdGhhdCBpbiBjYXNlIG9mIGxvbmcgbGluZXMgd2Ugc2hvdWxkIHN0YXJ0
IGhpZ2hsaWdodGluZwotICAgICAgICAvLyB0aGUgdmlzaWJsZSBhcmVhIGltbWVkaWF0ZWx5LCBp
bnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBsaW5lcyBhYm92ZSB0aGUgdmlzaWJsZSBhcmVhLgot
ICAgICAgICB2YXIgdmlzaWJsZUZyb20gPSB0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wOwotICAgICAg
ICB2YXIgZmlyc3RWaXNpYmxlTGluZU51bWJlciA9IHRoaXMuX2ZpbmRGaXJzdFZpc2libGVMaW5l
TnVtYmVyKHZpc2libGVGcm9tKTsKLQotICAgICAgICB2YXIgY2h1bms7Ci0gICAgICAgIHZhciBz
ZWxlY3Rpb247Ci0gICAgICAgIHZhciBpbnZpc2libGVMaW5lUm93cyA9IFtdOwotICAgICAgICBm
b3IgKHZhciBpID0gMDsgaSA8IGxpbmVDaHVua3MubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAg
IHZhciBsaW5lQ2h1bmsgPSBsaW5lQ2h1bmtzW2ldOwotICAgICAgICAgICAgaWYgKHRoaXMuX2Rp
cnR5TGluZXMgfHwgdGhpcy5fc2NoZWR1bGVkUGFpbnRMaW5lcykgewotICAgICAgICAgICAgICAg
IHRoaXMuX3NjaGVkdWxlUGFpbnRMaW5lcyhsaW5lQ2h1bmsuc3RhcnRMaW5lLCBsaW5lQ2h1bmsu
ZW5kTGluZSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBmb3IgKHZhciBsaW5lTnVtYmVyID0gbGluZUNodW5rLnN0YXJ0TGluZTsgbGluZU51
bWJlciA8IGxpbmVDaHVuay5lbmRMaW5lOyArK2xpbmVOdW1iZXIpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoIWNodW5rIHx8IGxpbmVOdW1iZXIgPCBjaHVuay5zdGFydExpbmUgfHwgbGluZU51bWJl
ciA+PSBjaHVuay5zdGFydExpbmUgKyBjaHVuay5saW5lc0NvdW50KQotICAgICAgICAgICAgICAg
ICAgICBjaHVuayA9IHRoaXMuY2h1bmtGb3JMaW5lKGxpbmVOdW1iZXIpOwotICAgICAgICAgICAg
ICAgIHZhciBsaW5lUm93ID0gY2h1bmsuZ2V0RXhwYW5kZWRMaW5lUm93KGxpbmVOdW1iZXIpOwot
ICAgICAgICAgICAgICAgIGlmICghbGluZVJvdykKLSAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1iZXIgPCBmaXJzdFZpc2libGVMaW5lTnVt
YmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmlzaWJsZUxpbmVSb3dzLnB1c2gobGluZVJv
dyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICBpZiAocmVzdG9yZVNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uKQotICAgICAg
ICAgICAgICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAg
ICAgICAgICB0aGlzLl9wYWludExpbmUobGluZVJvdyk7Ci0gICAgICAgICAgICAgICAgaWYgKHRo
aXMuX3BhaW50TGluZXNPcGVyYXRpb25zQ3JlZGl0IDwgMCkgewotICAgICAgICAgICAgICAgICAg
ICB0aGlzLl9zY2hlZHVsZVBhaW50TGluZXMobGluZU51bWJlciArIDEsIGxpbmVDaHVuay5lbmRM
aW5lKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnZp
c2libGVMaW5lUm93cy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgaWYgKHJlc3RvcmVTZWxl
Y3Rpb24gJiYgIXNlbGVjdGlvbikKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLl9n
ZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIHRoaXMuX3BhaW50TGluZShpbnZpc2libGVMaW5l
Um93c1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdG9yZVNlbGVjdGlvbikKLSAg
ICAgICAgICAgIHRoaXMuX3Jlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9LAotCi0g
ICAgLyoqCi0gICAgICogQHBhcmFtIHtFbGVtZW50fSBsaW5lUm93Ci0gICAgICovCi0gICAgX3Bh
aW50TGluZTogZnVuY3Rpb24obGluZVJvdykKLSAgICB7Ci0gICAgICAgIHZhciBsaW5lTnVtYmVy
ID0gbGluZVJvdy5saW5lTnVtYmVyOwotICAgICAgICBpZiAodGhpcy5fZGlydHlMaW5lcykgewot
ICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVQYWludExpbmVzKGxpbmVOdW1iZXIsIGxpbmVOdW1i
ZXIgKyAxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMu
YmVnaW5Eb21VcGRhdGVzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5f
c2NoZWR1bGVkUGFpbnRMaW5lcyB8fCB0aGlzLl9wYWludExpbmVzT3BlcmF0aW9uc0NyZWRpdCA8
IDApIHsKLSAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVBhaW50TGluZXMobGluZU51bWJl
ciwgbGluZU51bWJlciArIDEpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgdmFyIGhpZ2hsaWdodCA9IHRoaXMuX3RleHRNb2RlbC5nZXRBdHRy
aWJ1dGUobGluZU51bWJlciwgImhpZ2hsaWdodCIpOwotICAgICAgICAgICAgaWYgKCFoaWdobGln
aHQpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBsaW5lUm93LnJlbW92
ZUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICB2YXIgbGluZSA9IHRoaXMuX3RleHRNb2RlbC5saW5l
KGxpbmVOdW1iZXIpOwotICAgICAgICAgICAgaWYgKCFsaW5lKQotICAgICAgICAgICAgICAgIGxp
bmVSb3cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7Ci0KLSAgICAg
ICAgICAgIHZhciBwbGFpblRleHRTdGFydCA9IC0xOwotICAgICAgICAgICAgZm9yICh2YXIgaiA9
IDA7IGogPCBsaW5lLmxlbmd0aDspIHsKLSAgICAgICAgICAgICAgICBpZiAoaiA+IDEwMDApIHsK
LSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsaW5lIGlzIHRvbyBsb25nIC0gZG8gbm90IHdh
c3RlIGN5Y2xlcyBvbiBtaW5pZmllZCBqcyBoaWdobGlnaHRpbmcuCi0gICAgICAgICAgICAgICAg
ICAgIGlmIChwbGFpblRleHRTdGFydCA9PT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICBw
bGFpblRleHRTdGFydCA9IGo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gaGlnaGxpZ2h0W2pdOwot
ICAgICAgICAgICAgICAgIGlmICghYXR0cmlidXRlIHx8ICFhdHRyaWJ1dGUudG9rZW5UeXBlKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwbGFpblRleHRTdGFydCA9PT0gLTEpCi0gICAgICAg
ICAgICAgICAgICAgICAgICBwbGFpblRleHRTdGFydCA9IGo7Ci0gICAgICAgICAgICAgICAgICAg
IGorKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAo
cGxhaW5UZXh0U3RhcnQgIT09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9h
cHBlbmRUZXh0Tm9kZShsaW5lUm93LCBsaW5lLnN1YnN0cmluZyhwbGFpblRleHRTdGFydCwgaikp
OwotICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW5UZXh0U3RhcnQgPSAtMTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIC0tdGhpcy5fcGFpbnRMaW5lc09wZXJhdGlvbnNDcmVkaXQ7Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kU3Bhbihs
aW5lUm93LCBsaW5lLnN1YnN0cmluZyhqLCBqICsgYXR0cmlidXRlLmxlbmd0aCksIGF0dHJpYnV0
ZS50b2tlblR5cGUpOwotICAgICAgICAgICAgICAgICAgICBqICs9IGF0dHJpYnV0ZS5sZW5ndGg7
Ci0gICAgICAgICAgICAgICAgICAgIC0tdGhpcy5fcGFpbnRMaW5lc09wZXJhdGlvbnNDcmVkaXQ7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBsYWlu
VGV4dFN0YXJ0ICE9PSAtMSkgewotICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZFRleHROb2Rl
KGxpbmVSb3csIGxpbmUuc3Vic3RyaW5nKHBsYWluVGV4dFN0YXJ0LCBsaW5lLmxlbmd0aCkpOwot
ICAgICAgICAgICAgICAgIC0tdGhpcy5fcGFpbnRMaW5lc09wZXJhdGlvbnNDcmVkaXQ7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZVJvdy5kZWNvcmF0aW9uc0VsZW1lbnQpCi0g
ICAgICAgICAgICAgICAgbGluZVJvdy5hcHBlbmRDaGlsZChsaW5lUm93LmRlY29yYXRpb25zRWxl
bWVudCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5fcmFuZ2VU
b01hcmsgJiYgdGhpcy5fcmFuZ2VUb01hcmsuc3RhcnRMaW5lID09PSBsaW5lTnVtYmVyKQotICAg
ICAgICAgICAgICAgIHRoaXMuX21hcmtlZFJhbmdlRWxlbWVudCA9IFdlYkluc3BlY3Rvci5oaWdo
bGlnaHRTZWFyY2hSZXN1bHQobGluZVJvdywgdGhpcy5fcmFuZ2VUb01hcmsuc3RhcnRDb2x1bW4s
IHRoaXMuX3JhbmdlVG9NYXJrLmVuZENvbHVtbiAtIHRoaXMuX3JhbmdlVG9NYXJrLnN0YXJ0Q29s
dW1uKTsKLSAgICAgICAgICAgIHRoaXMuZW5kRG9tVXBkYXRlcygpOwotICAgICAgICB9Ci0gICAg
fSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbGluZVJvdwotICAgICAqLwot
ICAgIF9yZWxlYXNlTGluZXNIaWdobGlnaHQ6IGZ1bmN0aW9uKGxpbmVSb3cpCi0gICAgewotICAg
ICAgICBpZiAoIWxpbmVSb3cpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmICgic3Bh
bnMiIGluIGxpbmVSb3cpIHsKLSAgICAgICAgICAgIHZhciBzcGFucyA9IGxpbmVSb3cuc3BhbnM7
Ci0gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNwYW5zLmxlbmd0aDsgKytqKQotICAg
ICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFNwYW5zLnB1c2goc3BhbnNbal0pOwotICAgICAgICAg
ICAgZGVsZXRlIGxpbmVSb3cuc3BhbnM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJ0ZXh0Tm9k
ZXMiIGluIGxpbmVSb3cpIHsKLSAgICAgICAgICAgIHZhciB0ZXh0Tm9kZXMgPSBsaW5lUm93LnRl
eHROb2RlczsKLSAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGV4dE5vZGVzLmxlbmd0
aDsgKytqKQotICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFRleHROb2Rlcy5wdXNoKHRleHRO
b2Rlc1tqXSk7Ci0gICAgICAgICAgICBkZWxldGUgbGluZVJvdy50ZXh0Tm9kZXM7Ci0gICAgICAg
IH0KLSAgICAgICAgdGhpcy5fY2FjaGVkUm93cy5wdXNoKGxpbmVSb3cpOwotICAgIH0sCi0KLSAg
ICAvKioKLSAgICAgKiBAcmV0dXJuIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfQotICAgICAqLwot
ICAgIF9nZXRTZWxlY3Rpb246IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHZhciBzZWxlY3Rp
b24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdl
Q291bnQpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgLy8gU2VsZWN0aW9uIG1h
eSBiZSBvdXRzaWRlIG9mIHRoZSBlZGl0b3IuCi0gICAgICAgIGlmICghdGhpcy5fY29udGFpbmVy
LmlzQW5jZXN0b3Ioc2VsZWN0aW9uLmFuY2hvck5vZGUpIHx8ICF0aGlzLl9jb250YWluZXIuaXNB
bmNlc3RvcihzZWxlY3Rpb24uZm9jdXNOb2RlKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwot
ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLl9zZWxlY3Rpb25Ub1Bvc2l0aW9uKHNlbGVjdGlvbi5h
bmNob3JOb2RlLCBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0KTsKLSAgICAgICAgdmFyIGVuZCA9IHNl
bGVjdGlvbi5pc0NvbGxhcHNlZCA/IHN0YXJ0IDogdGhpcy5fc2VsZWN0aW9uVG9Qb3NpdGlvbihz
ZWxlY3Rpb24uZm9jdXNOb2RlLCBzZWxlY3Rpb24uZm9jdXNPZmZzZXQpOwotICAgICAgICByZXR1
cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2Uoc3RhcnQubGluZSwgc3RhcnQuY29sdW1uLCBl
bmQubGluZSwgZW5kLmNvbHVtbik7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7
Ym9vbGVhbj19IHNjcm9sbEludG9WaWV3Ci0gICAgICovCi0gICAgX3Jlc3RvcmVTZWxlY3Rpb246
IGZ1bmN0aW9uKHJhbmdlLCBzY3JvbGxJbnRvVmlldykKLSAgICB7Ci0gICAgICAgIGlmICghcmFu
Z2UpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHZhciBzdGFydCA9IHRoaXMuX3Bvc2l0
aW9uVG9TZWxlY3Rpb24ocmFuZ2Uuc3RhcnRMaW5lLCByYW5nZS5zdGFydENvbHVtbik7Ci0gICAg
ICAgIHZhciBlbmQgPSByYW5nZS5pc0VtcHR5KCkgPyBzdGFydCA6IHRoaXMuX3Bvc2l0aW9uVG9T
ZWxlY3Rpb24ocmFuZ2UuZW5kTGluZSwgcmFuZ2UuZW5kQ29sdW1uKTsKLSAgICAgICAgd2luZG93
LmdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRFeHRlbnQoc3RhcnQuY29udGFpbmVyLCBzdGFydC5v
ZmZzZXQsIGVuZC5jb250YWluZXIsIGVuZC5vZmZzZXQpOwotCi0gICAgICAgIGlmIChzY3JvbGxJ
bnRvVmlldykgewotICAgICAgICAgICAgZm9yICh2YXIgbm9kZSA9IGVuZC5jb250YWluZXI7IG5v
ZGU7IG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAobm9k
ZS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUuc2Ny
b2xsSW50b1ZpZXdJZk5lZWRlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgLyoq
Ci0gICAgICogQHBhcmFtIHtOb2RlfSBjb250YWluZXIKLSAgICAgKiBAcGFyYW0ge251bWJlcn0g
b2Zmc2V0Ci0gICAgICovCi0gICAgX3NlbGVjdGlvblRvUG9zaXRpb246IGZ1bmN0aW9uKGNvbnRh
aW5lciwgb2Zmc2V0KQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRhaW5lciA9PT0gdGhpcy5fY29u
dGFpbmVyICYmIG9mZnNldCA9PT0gMCkKLSAgICAgICAgICAgIHJldHVybiB7IGxpbmU6IDAsIGNv
bHVtbjogMCB9OwotICAgICAgICBpZiAoY29udGFpbmVyID09PSB0aGlzLl9jb250YWluZXIgJiYg
b2Zmc2V0ID09PSAxKQotICAgICAgICAgICAgcmV0dXJuIHsgbGluZTogdGhpcy5fdGV4dE1vZGVs
LmxpbmVzQ291bnQgLSAxLCBjb2x1bW46IHRoaXMuX3RleHRNb2RlbC5saW5lTGVuZ3RoKHRoaXMu
X3RleHRNb2RlbC5saW5lc0NvdW50IC0gMSkgfTsKLQotICAgICAgICB2YXIgbGluZVJvdyA9IHRo
aXMuX2VuY2xvc2luZ0xpbmVSb3dPclNlbGYoY29udGFpbmVyKTsKLSAgICAgICAgdmFyIGxpbmVO
dW1iZXIgPSBsaW5lUm93LmxpbmVOdW1iZXI7Ci0gICAgICAgIGlmIChjb250YWluZXIgPT09IGxp
bmVSb3cgJiYgb2Zmc2V0ID09PSAwKQotICAgICAgICAgICAgcmV0dXJuIHsgbGluZTogbGluZU51
bWJlciwgY29sdW1uOiAwIH07Ci0KLSAgICAgICAgLy8gVGhpcyBtYXkgYmUgY2h1bmsgYW5kIGNo
dW5rcyBtYXkgY29udGFpbiBcbi4KLSAgICAgICAgdmFyIGNvbHVtbiA9IDA7Ci0gICAgICAgIHZh
ciBub2RlID0gbGluZVJvdy5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgPyBsaW5lUm93IDog
bGluZVJvdy50cmF2ZXJzZU5leHRUZXh0Tm9kZShsaW5lUm93KTsKLSAgICAgICAgd2hpbGUgKG5v
ZGUgJiYgbm9kZSAhPT0gY29udGFpbmVyKSB7Ci0gICAgICAgICAgICB2YXIgdGV4dCA9IG5vZGUu
dGV4dENvbnRlbnQ7Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3Ro
OyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09ICJcbiIpIHsK
LSAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcisrOwotICAgICAgICAgICAgICAgICAgICBj
b2x1bW4gPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBj
b2x1bW4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLnRyYXZlcnNl
TmV4dFRleHROb2RlKGxpbmVSb3cpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5vZGUgPT09
IGNvbnRhaW5lciAmJiBvZmZzZXQpIHsKLSAgICAgICAgICAgIHZhciB0ZXh0ID0gbm9kZS50ZXh0
Q29udGVudDsKLSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2Zmc2V0OyArK2kpIHsK
LSAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09ICJcbiIpIHsKLSAgICAgICAg
ICAgICAgICAgICAgbGluZU51bWJlcisrOwotICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAw
OwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBjb2x1bW4rKzsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4geyBsaW5lOiBsaW5lTnVt
YmVyLCBjb2x1bW46IGNvbHVtbiB9OwotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0g
e251bWJlcn0gbGluZQotICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW4KLSAgICAgKi8KLSAg
ICBfcG9zaXRpb25Ub1NlbGVjdGlvbjogZnVuY3Rpb24obGluZSwgY29sdW1uKQotICAgIHsKLSAg
ICAgICAgdmFyIGNodW5rID0gdGhpcy5jaHVua0ZvckxpbmUobGluZSk7Ci0gICAgICAgIC8vIE9u
ZS1saW5lZCBjb2xsYXBzZWQgY2h1bmtzIG1heSBzdGlsbCBzdGF5IGhpZ2hsaWdodGVkLgotICAg
ICAgICB2YXIgbGluZVJvdyA9IGNodW5rLmxpbmVzQ291bnQgPT09IDEgPyBjaHVuay5lbGVtZW50
IDogY2h1bmsuZ2V0RXhwYW5kZWRMaW5lUm93KGxpbmUpOwotICAgICAgICBpZiAobGluZVJvdykK
LSAgICAgICAgICAgIHZhciByYW5nZUJvdW5kYXJ5ID0gbGluZVJvdy5yYW5nZUJvdW5kYXJ5Rm9y
T2Zmc2V0KGNvbHVtbik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdmFyIG9mZnNldCA9
IGNvbHVtbjsKLSAgICAgICAgICAgIGZvciAodmFyIGkgPSBjaHVuay5zdGFydExpbmU7IGkgPCBs
aW5lOyArK2kpCi0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMuX3RleHRNb2RlbC5saW5l
TGVuZ3RoKGkpICsgMTsgLy8gXG4KLSAgICAgICAgICAgIGxpbmVSb3cgPSBjaHVuay5lbGVtZW50
OwotICAgICAgICAgICAgaWYgKGxpbmVSb3cuZmlyc3RDaGlsZCkKLSAgICAgICAgICAgICAgICB2
YXIgcmFuZ2VCb3VuZGFyeSA9IHsgY29udGFpbmVyOiBsaW5lUm93LmZpcnN0Q2hpbGQsIG9mZnNl
dDogb2Zmc2V0IH07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdmFyIHJhbmdl
Qm91bmRhcnkgPSB7IGNvbnRhaW5lcjogbGluZVJvdywgb2Zmc2V0OiAwIH07Ci0gICAgICAgIH0K
LSAgICAgICAgcmV0dXJuIHJhbmdlQm91bmRhcnk7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAq
IEBwYXJhbSB7Tm9kZX0gZWxlbWVudAotICAgICAqLwotICAgIF9lbmNsb3NpbmdMaW5lUm93T3JT
ZWxmOiBmdW5jdGlvbihlbGVtZW50KQotICAgIHsKLSAgICAgICAgdmFyIGxpbmVSb3cgPSBlbGVt
ZW50LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoIndlYmtpdC1saW5lLWNvbnRlbnQiKTsK
LSAgICAgICAgaWYgKGxpbmVSb3cpCi0gICAgICAgICAgICByZXR1cm4gbGluZVJvdzsKLQotICAg
ICAgICBmb3IgKGxpbmVSb3cgPSBlbGVtZW50OyBsaW5lUm93OyBsaW5lUm93ID0gbGluZVJvdy5w
YXJlbnRFbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAobGluZVJvdy5wYXJlbnRFbGVtZW50ID09
PSB0aGlzLl9jb250YWluZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVSb3c7Ci0gICAg
ICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBw
YXJhbSB7RWxlbWVudH0gZWxlbWVudAotICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50Ci0g
ICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZQotICAgICAqLwotICAgIF9hcHBlbmRTcGFu
OiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50LCBjbGFzc05hbWUpCi0gICAgewotICAgICAgICBp
ZiAoY2xhc3NOYW1lID09PSAiaHRtbC1yZXNvdXJjZS1saW5rIiB8fCBjbGFzc05hbWUgPT09ICJo
dG1sLWV4dGVybmFsLWxpbmsiKSB7Ci0gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRo
aXMuX2NyZWF0ZUxpbmsoY29udGVudCwgY2xhc3NOYW1lID09PSAiaHRtbC1leHRlcm5hbC1saW5r
IikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHNwYW4g
PSB0aGlzLl9jYWNoZWRTcGFucy5wb3AoKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFu
Iik7Ci0gICAgICAgIHNwYW4uY2xhc3NOYW1lID0gIndlYmtpdC0iICsgY2xhc3NOYW1lOwotICAg
ICAgICBzcGFuLnRleHRDb250ZW50ID0gY29udGVudDsKLSAgICAgICAgZWxlbWVudC5hcHBlbmRD
aGlsZChzcGFuKTsKLSAgICAgICAgaWYgKCEoInNwYW5zIiBpbiBlbGVtZW50KSkKLSAgICAgICAg
ICAgIGVsZW1lbnQuc3BhbnMgPSBbXTsKLSAgICAgICAgZWxlbWVudC5zcGFucy5wdXNoKHNwYW4p
OwotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQKLSAg
ICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dAotICAgICAqLwotICAgIF9hcHBlbmRUZXh0Tm9kZTog
ZnVuY3Rpb24oZWxlbWVudCwgdGV4dCkKLSAgICB7Ci0gICAgICAgIHZhciB0ZXh0Tm9kZSA9IHRo
aXMuX2NhY2hlZFRleHROb2Rlcy5wb3AoKTsKLSAgICAgICAgaWYgKHRleHROb2RlKQotICAgICAg
ICAgICAgdGV4dE5vZGUubm9kZVZhbHVlID0gdGV4dDsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsKLSAgICAgICAgZWxl
bWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICAgIGlmICghKCJ0ZXh0Tm9kZXMiIGlu
IGVsZW1lbnQpKQotICAgICAgICAgICAgZWxlbWVudC50ZXh0Tm9kZXMgPSBbXTsKLSAgICAgICAg
ZWxlbWVudC50ZXh0Tm9kZXMucHVzaCh0ZXh0Tm9kZSk7Ci0gICAgfSwKLQotICAgIC8qKgotICAg
ICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50Ci0gICAgICogQHBhcmFtIHtib29sZWFufSBpc0V4
dGVybmFsCi0gICAgICovCi0gICAgX2NyZWF0ZUxpbms6IGZ1bmN0aW9uKGNvbnRlbnQsIGlzRXh0
ZXJuYWwpCi0gICAgewotICAgICAgICB2YXIgcXVvdGUgPSBjb250ZW50LmNoYXJBdCgwKTsKLSAg
ICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gMSAmJiAocXVvdGUgPT09ICJcIiIgfHwgICBxdW90
ZSA9PT0gIiciKSkKLSAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZygxLCBj
b250ZW50Lmxlbmd0aCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBxdW90ZSA9IG51
bGw7Ci0KLSAgICAgICAgdmFyIGEgPSBXZWJJbnNwZWN0b3IubGlua2lmeVVSTEFzTm9kZSh0aGlz
Ll9yZXdyaXRlSHJlZihjb250ZW50KSwgY29udGVudCwgdW5kZWZpbmVkLCBpc0V4dGVybmFsKTsK
LSAgICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Ci0gICAg
ICAgIHNwYW4uY2xhc3NOYW1lID0gIndlYmtpdC1odG1sLWF0dHJpYnV0ZS12YWx1ZSI7Ci0gICAg
ICAgIGlmIChxdW90ZSkKLSAgICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3Jl
YXRlVGV4dE5vZGUocXVvdGUpKTsKLSAgICAgICAgc3Bhbi5hcHBlbmRDaGlsZChhKTsKLSAgICAg
ICAgaWYgKHF1b3RlKQotICAgICAgICAgICAgc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVh
dGVUZXh0Tm9kZShxdW90ZSkpOwotICAgICAgICByZXR1cm4gc3BhbjsKLSAgICB9LAotCi0gICAg
LyoqCi0gICAgICogQHBhcmFtIHtzdHJpbmc9fSBocmVmVmFsdWUKLSAgICAgKiBAcGFyYW0ge2Jv
b2xlYW49fSBpc0V4dGVybmFsCi0gICAgICovCi0gICAgX3Jld3JpdGVIcmVmOiBmdW5jdGlvbiho
cmVmVmFsdWUsIGlzRXh0ZXJuYWwpCi0gICAgewotICAgICAgICBpZiAoIXRoaXMuX3VybCB8fCAh
aHJlZlZhbHVlIHx8IGhyZWZWYWx1ZS5pbmRleE9mKCI6Ly8iKSA+IDApCi0gICAgICAgICAgICBy
ZXR1cm4gaHJlZlZhbHVlOwotICAgICAgICByZXR1cm4gV2ViSW5zcGVjdG9yLmNvbXBsZXRlVVJM
KHRoaXMuX3VybCwgaHJlZlZhbHVlKTsKLSAgICB9LAotCi0gICAgX2hhbmRsZURPTVVwZGF0ZXM6
IGZ1bmN0aW9uKGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5fZG9tVXBkYXRlQ29hbGVzY2lu
Z0xldmVsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHZhciB0YXJnZXQgPSBlLnRh
cmdldDsKLSAgICAgICAgaWYgKHRhcmdldCA9PT0gdGhpcy5fY29udGFpbmVyKQotICAgICAgICAg
ICAgcmV0dXJuOwotCi0gICAgICAgIHZhciBsaW5lUm93ID0gdGhpcy5fZW5jbG9zaW5nTGluZVJv
d09yU2VsZih0YXJnZXQpOwotICAgICAgICBpZiAoIWxpbmVSb3cpCi0gICAgICAgICAgICByZXR1
cm47Ci0KLSAgICAgICAgaWYgKGxpbmVSb3cuZGVjb3JhdGlvbnNFbGVtZW50ICYmIGxpbmVSb3cu
ZGVjb3JhdGlvbnNFbGVtZW50LmlzU2VsZk9yQW5jZXN0b3IodGFyZ2V0KSkgewotICAgICAgICAg
ICAgaWYgKHRoaXMuX3N5bmNEZWNvcmF0aW9uc0ZvckxpbmVMaXN0ZW5lcikKLSAgICAgICAgICAg
ICAgICB0aGlzLl9zeW5jRGVjb3JhdGlvbnNGb3JMaW5lTGlzdGVuZXIobGluZVJvdy5saW5lTnVt
YmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlz
Ll9yZWFkT25seSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAodGFyZ2V0ID09
PSBsaW5lUm93ICYmIGUudHlwZSA9PT0gIkRPTU5vZGVJbnNlcnRlZCIpIHsKLSAgICAgICAgICAg
IC8vIEVuc3VyZSB0aGF0IHRoZSBuZXdseSBpbnNlcnRlZCBsaW5lIHJvdyBoYXMgbm8gbGluZU51
bWJlci4KLSAgICAgICAgICAgIGRlbGV0ZSBsaW5lUm93LmxpbmVOdW1iZXI7Ci0gICAgICAgIH0K
LQotICAgICAgICB2YXIgc3RhcnRMaW5lID0gMDsKLSAgICAgICAgZm9yICh2YXIgcm93ID0gbGlu
ZVJvdzsgcm93OyByb3cgPSByb3cucHJldmlvdXNTaWJsaW5nKSB7Ci0gICAgICAgICAgICBpZiAo
dHlwZW9mIHJvdy5saW5lTnVtYmVyID09PSAibnVtYmVyIikgewotICAgICAgICAgICAgICAgIHN0
YXJ0TGluZSA9IHJvdy5saW5lTnVtYmVyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIGVuZExpbmUgPSBzdGFydExpbmUgKyAx
OwotICAgICAgICBmb3IgKHZhciByb3cgPSBsaW5lUm93Lm5leHRTaWJsaW5nOyByb3c7IHJvdyA9
IHJvdy5uZXh0U2libGluZykgewotICAgICAgICAgICAgaWYgKHR5cGVvZiByb3cubGluZU51bWJl
ciA9PT0gIm51bWJlciIgJiYgcm93LmxpbmVOdW1iZXIgPiBzdGFydExpbmUpIHsKLSAgICAgICAg
ICAgICAgICBlbmRMaW5lID0gcm93LmxpbmVOdW1iZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFyZ2V0ID09PSBsaW5l
Um93ICYmIGUudHlwZSA9PT0gIkRPTU5vZGVSZW1vdmVkIikgewotICAgICAgICAgICAgLy8gTm93
IHRoaXMgd2lsbCBubyBsb25nZXIgYmUgdmFsaWQuCi0gICAgICAgICAgICBkZWxldGUgbGluZVJv
dy5saW5lTnVtYmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMuX2RpcnR5TGluZXMp
IHsKLSAgICAgICAgICAgIHRoaXMuX2RpcnR5TGluZXMuc3RhcnQgPSBNYXRoLm1pbih0aGlzLl9k
aXJ0eUxpbmVzLnN0YXJ0LCBzdGFydExpbmUpOwotICAgICAgICAgICAgdGhpcy5fZGlydHlMaW5l
cy5lbmQgPSBNYXRoLm1heCh0aGlzLl9kaXJ0eUxpbmVzLmVuZCwgZW5kTGluZSk7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLl9kaXJ0eUxpbmVzID0geyBzdGFydDogc3RhcnRM
aW5lLCBlbmQ6IGVuZExpbmUgfTsKLSAgICAgICAgICAgIHNldFRpbWVvdXQodGhpcy5fYXBwbHlE
b21VcGRhdGVzLmJpbmQodGhpcyksIDApOwotICAgICAgICAgICAgLy8gUmVtb3ZlIG1hcmtlZCBy
YW5nZXMsIGlmIGFueS4KLSAgICAgICAgICAgIHRoaXMubWFya0FuZFJldmVhbFJhbmdlKG51bGwp
OwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIF9hcHBseURvbVVwZGF0ZXM6IGZ1bmN0aW9uKCkK
LSAgICB7Ci0gICAgICAgIGlmICghdGhpcy5fZGlydHlMaW5lcykKLSAgICAgICAgICAgIHJldHVy
bjsKLQotICAgICAgICAvLyBDaGVjayBpZiB0aGUgZWRpdG9yIGhhZCBiZWVuIHNldCByZWFkT25s
eSBieSB0aGUgbW9tZW50IHdoZW4gdGhpcyBhc3luYyBjYWxsYmFjayBnb3QgZXhlY3V0ZWQuCi0g
ICAgICAgIGlmICh0aGlzLl9yZWFkT25seSkgewotICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2Rp
cnR5TGluZXM7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIg
ZGlydHlMaW5lcyA9IHRoaXMuX2RpcnR5TGluZXM7Ci0KLSAgICAgICAgdmFyIGZpcnN0Q2h1bmtO
dW1iZXIgPSB0aGlzLl9jaHVua051bWJlckZvckxpbmUoZGlydHlMaW5lcy5zdGFydCk7Ci0gICAg
ICAgIHZhciBzdGFydExpbmUgPSB0aGlzLl90ZXh0Q2h1bmtzW2ZpcnN0Q2h1bmtOdW1iZXJdLnN0
YXJ0TGluZTsKLSAgICAgICAgdmFyIGVuZExpbmUgPSB0aGlzLl90ZXh0TW9kZWwubGluZXNDb3Vu
dDsKLQotICAgICAgICAvLyBDb2xsZWN0IGxpbmVzLgotICAgICAgICB2YXIgZmlyc3RMaW5lUm93
OwotICAgICAgICBpZiAoZmlyc3RDaHVua051bWJlcikgewotICAgICAgICAgICAgdmFyIGNodW5r
ID0gdGhpcy5fdGV4dENodW5rc1tmaXJzdENodW5rTnVtYmVyIC0gMV07Ci0gICAgICAgICAgICBm
aXJzdExpbmVSb3cgPSBjaHVuay5leHBhbmRlZCA/IGNodW5rLmdldEV4cGFuZGVkTGluZVJvdyhj
aHVuay5zdGFydExpbmUgKyBjaHVuay5saW5lc0NvdW50IC0gMSkgOiBjaHVuay5lbGVtZW50Owot
ICAgICAgICAgICAgZmlyc3RMaW5lUm93ID0gZmlyc3RMaW5lUm93Lm5leHRTaWJsaW5nOwotICAg
ICAgICB9IGVsc2UKLSAgICAgICAgICAgIGZpcnN0TGluZVJvdyA9IHRoaXMuX2NvbnRhaW5lci5m
aXJzdENoaWxkOwotCi0gICAgICAgIHZhciBsaW5lcyA9IFtdOwotICAgICAgICBmb3IgKHZhciBs
aW5lUm93ID0gZmlyc3RMaW5lUm93OyBsaW5lUm93OyBsaW5lUm93ID0gbGluZVJvdy5uZXh0U2li
bGluZykgewotICAgICAgICAgICAgaWYgKHR5cGVvZiBsaW5lUm93LmxpbmVOdW1iZXIgPT09ICJu
dW1iZXIiICYmIGxpbmVSb3cubGluZU51bWJlciA+PSBkaXJ0eUxpbmVzLmVuZCkgewotICAgICAg
ICAgICAgICAgIGVuZExpbmUgPSBsaW5lUm93LmxpbmVOdW1iZXI7Ci0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBVcGRhdGUgd2l0aCB0aGUgbmV3
ZXN0IGxpbmVOdW1iZXIsIHNvIHRoYXQgdGhlIGNhbGwgdG8gdGhlIF9nZXRTZWxlY3Rpb24gbWV0
aG9kIGJlbG93IHNob3VsZCB3b3JrLgotICAgICAgICAgICAgbGluZVJvdy5saW5lTnVtYmVyID0g
c3RhcnRMaW5lICsgbGluZXMubGVuZ3RoOwotICAgICAgICAgICAgdGhpcy5fY29sbGVjdExpbmVz
RnJvbURpdihsaW5lcywgbGluZVJvdyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUcnkgdG8g
ZGVjcmVhc2UgdGhlIHJhbmdlIGJlaW5nIHJlcGxhY2VkLCBpZiBwb3NzaWJsZS4KLSAgICAgICAg
dmFyIHN0YXJ0T2Zmc2V0ID0gMDsKLSAgICAgICAgd2hpbGUgKHN0YXJ0TGluZSA8IGRpcnR5TGlu
ZXMuc3RhcnQgJiYgc3RhcnRPZmZzZXQgPCBsaW5lcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIGlm
ICh0aGlzLl90ZXh0TW9kZWwubGluZShzdGFydExpbmUpICE9PSBsaW5lc1tzdGFydE9mZnNldF0p
Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICArK3N0YXJ0T2Zmc2V0OwotICAg
ICAgICAgICAgKytzdGFydExpbmU7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgZW5kT2Zmc2V0
ID0gbGluZXMubGVuZ3RoOwotICAgICAgICB3aGlsZSAoZW5kTGluZSA+IGRpcnR5TGluZXMuZW5k
ICYmIGVuZE9mZnNldCA+IHN0YXJ0T2Zmc2V0KSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5fdGV4
dE1vZGVsLmxpbmUoZW5kTGluZSAtIDEpICE9PSBsaW5lc1tlbmRPZmZzZXQgLSAxXSkKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC0tZW5kT2Zmc2V0OwotICAgICAgICAgICAg
LS1lbmRMaW5lOwotICAgICAgICB9Ci0KLSAgICAgICAgbGluZXMgPSBsaW5lcy5zbGljZShzdGFy
dE9mZnNldCwgZW5kT2Zmc2V0KTsKLQotICAgICAgICAvLyBUcnkgdG8gZGVjcmVhc2UgdGhlIHJh
bmdlIGJlaW5nIHJlcGxhY2VkIGJ5IGNvbHVtbiBvZmZzZXRzLCBpZiBwb3NzaWJsZS4KLSAgICAg
ICAgdmFyIHN0YXJ0Q29sdW1uID0gMDsKLSAgICAgICAgdmFyIGVuZENvbHVtbiA9IHRoaXMuX3Rl
eHRNb2RlbC5saW5lTGVuZ3RoKGVuZExpbmUgLSAxKTsKLSAgICAgICAgaWYgKGxpbmVzLmxlbmd0
aCA+IDApIHsKLSAgICAgICAgICAgIHZhciBsaW5lMSA9IHRoaXMuX3RleHRNb2RlbC5saW5lKHN0
YXJ0TGluZSk7Ci0gICAgICAgICAgICB2YXIgbGluZTIgPSBsaW5lc1swXTsKLSAgICAgICAgICAg
IHdoaWxlIChsaW5lMVtzdGFydENvbHVtbl0gJiYgbGluZTFbc3RhcnRDb2x1bW5dID09PSBsaW5l
MltzdGFydENvbHVtbl0pCi0gICAgICAgICAgICAgICAgKytzdGFydENvbHVtbjsKLSAgICAgICAg
ICAgIGxpbmVzWzBdID0gbGluZTIuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uKTsKLQotICAgICAgICAg
ICAgbGluZTEgPSB0aGlzLl90ZXh0TW9kZWwubGluZShlbmRMaW5lIC0gMSk7Ci0gICAgICAgICAg
ICBsaW5lMiA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdOwotICAgICAgICAgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCBlbmRDb2x1bW4gJiYgaSA8IGxpbmUyLmxlbmd0aDsgKytpKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKHN0YXJ0TGluZSA9PT0gZW5kTGluZSAtIDEgJiYgZW5kQ29sdW1uIC0gaSA8
PSBzdGFydENvbHVtbikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgaWYgKGxpbmUxW2VuZENvbHVtbiAtIGkgLSAxXSAhPT0gbGluZTJbbGluZTIubGVuZ3RoIC0g
aSAtIDFdKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGlmIChpKSB7Ci0gICAgICAgICAgICAgICAgZW5kQ29sdW1uIC09IGk7Ci0gICAgICAg
ICAgICAgICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPSBsaW5lMi5zdWJzdHJpbmcoMCwgbGlu
ZTIubGVuZ3RoIC0gaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIg
c2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgaWYgKGxpbmVzLmxl
bmd0aCA9PT0gMCAmJiBlbmRMaW5lIDwgdGhpcy5fdGV4dE1vZGVsLmxpbmVzQ291bnQpCi0gICAg
ICAgICAgICB2YXIgb2xkUmFuZ2UgPSBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZShzdGFydExp
bmUsIDAsIGVuZExpbmUsIDApOwotICAgICAgICBlbHNlIGlmIChsaW5lcy5sZW5ndGggPT09IDAg
JiYgc3RhcnRMaW5lID4gMCkKLSAgICAgICAgICAgIHZhciBvbGRSYW5nZSA9IG5ldyBXZWJJbnNw
ZWN0b3IuVGV4dFJhbmdlKHN0YXJ0TGluZSAtIDEsIHRoaXMuX3RleHRNb2RlbC5saW5lTGVuZ3Ro
KHN0YXJ0TGluZSAtIDEpLCBlbmRMaW5lIC0gMSwgdGhpcy5fdGV4dE1vZGVsLmxpbmVMZW5ndGgo
ZW5kTGluZSAtIDEpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFyIG9sZFJhbmdlID0g
bmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2Uoc3RhcnRMaW5lLCBzdGFydENvbHVtbiwgZW5kTGlu
ZSAtIDEsIGVuZENvbHVtbik7Ci0KLSAgICAgICAgdmFyIG5ld0NvbnRlbnQgPSBsaW5lcy5qb2lu
KCJcbiIpOwotICAgICAgICBpZiAodGhpcy5fdGV4dE1vZGVsLmNvcHlSYW5nZShvbGRSYW5nZSkg
PT09IG5ld0NvbnRlbnQpIHsKLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9kaXJ0eUxpbmVzOwot
ICAgICAgICAgICAgcmV0dXJuOyAvLyBOb29wCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlu
ZXMubGVuZ3RoID09PSAxICYmIGxpbmVzWzBdID09PSAifSIgJiYgb2xkUmFuZ2UuaXNFbXB0eSgp
ICYmIHNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgIXRoaXMuX3RleHRNb2RlbC5saW5lKG9sZFJhbmdl
LmVuZExpbmUpLnRyaW0oKSkKLSAgICAgICAgICAgIHRoaXMuX3VuaW5kZW50QWZ0ZXJCbG9jayhv
bGRSYW5nZSwgc2VsZWN0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgaXMgYSAiZm9y
ZWlnbiIgY2FsbCBvdXRzaWRlIG9mIHRoaXMgY2xhc3MuIFNob3VsZCBiZSBiZWZvcmUgd2UgZGVs
ZXRlIHRoZSBkaXJ0eSBsaW5lcyBmbGFnLgotICAgICAgICB0aGlzLl9lbnRlclRleHRDaGFuZ2VN
b2RlKCk7Ci0KLSAgICAgICAgZGVsZXRlIHRoaXMuX2RpcnR5TGluZXM7Ci0KLSAgICAgICAgdmFy
IG5ld1JhbmdlID0gdGhpcy5fZWRpdFJhbmdlKG9sZFJhbmdlLCBuZXdDb250ZW50KTsKLQotICAg
ICAgICB0aGlzLl9wYWludFNjaGVkdWxlZExpbmVzKHRydWUpOwotICAgICAgICB0aGlzLl9yZXN0
b3JlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLSAgICAgICAgdGhpcy5fZXhpdFRleHRDaGFuZ2VN
b2RlKG9sZFJhbmdlLCBuZXdSYW5nZSk7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJh
bSB7V2ViSW5zcGVjdG9yLlRleHRSYW5nZX0gb2xkUmFuZ2UKLSAgICAgKiBAcGFyYW0ge1dlYklu
c3BlY3Rvci5UZXh0UmFuZ2V9IHNlbGVjdGlvbgotICAgICAqLwotICAgIF91bmluZGVudEFmdGVy
QmxvY2s6IGZ1bmN0aW9uKG9sZFJhbmdlLCBzZWxlY3Rpb24pCi0gICAgewotICAgICAgICB2YXIg
bmVzdGluZ0xldmVsID0gMTsKLSAgICAgICAgZm9yICh2YXIgaSA9IG9sZFJhbmdlLmVuZExpbmU7
IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gdGhpcy5fdGV4dE1v
ZGVsLmdldEF0dHJpYnV0ZShpLCAiaGlnaGxpZ2h0Iik7Ci0gICAgICAgICAgICBpZiAoIWF0dHJp
YnV0ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHZhciBjb2x1bW5O
dW1iZXJzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlKS5yZXZlcnNlKCk7Ci0gICAgICAgICAgICBm
b3IgKHZhciBqID0gMDsgaiA8IGNvbHVtbk51bWJlcnMubGVuZ3RoOyArK2opIHsKLSAgICAgICAg
ICAgICAgICB2YXIgY29sdW1uID0gY29sdW1uTnVtYmVyc1tqXTsKLSAgICAgICAgICAgICAgICBp
ZiAoYXR0cmlidXRlW2NvbHVtbl0udG9rZW5UeXBlID09PSAiYmxvY2stc3RhcnQiKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmICghKC0tbmVzdGluZ0xldmVsKSkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgdmFyIGxpbmVDb250ZW50ID0gdGhpcy5fdGV4dE1vZGVsLmxpbmUoaSk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICB2YXIgYmxvY2tPZmZzZXQgPSBsaW5lQ29udGVudC5sZW5ndGgg
LSBsaW5lQ29udGVudC50cmltTGVmdCgpLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChibG9ja09mZnNldCA8IG9sZFJhbmdlLnN0YXJ0Q29sdW1uKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgb2xkUmFuZ2Uuc3RhcnRDb2x1bW4gPSBibG9ja09mZnNldDsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uc3RhcnRDb2x1bW4gPSBibG9ja09mZnNl
dCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmVuZENvbHVtbiA9
IGJsb2NrT2Zmc2V0ICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlW2NvbHVtbl0udG9rZW5UeXBlID09
PSAiYmxvY2stZW5kIikKLSAgICAgICAgICAgICAgICAgICAgKytuZXN0aW5nTGV2ZWw7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHtX
ZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSBvbGRSYW5nZQotICAgICAqIEBwYXJhbSB7V2ViSW5zcGVj
dG9yLlRleHRSYW5nZX0gbmV3UmFuZ2UKLSAgICAgKi8KLSAgICB0ZXh0Q2hhbmdlZDogZnVuY3Rp
b24ob2xkUmFuZ2UsIG5ld1JhbmdlKQotICAgIHsKLSAgICAgICAgdGhpcy5iZWdpbkRvbVVwZGF0
ZXMoKTsKLSAgICAgICAgdGhpcy5fcmVtb3ZlRGVjb3JhdGlvbnNJblJhbmdlKG9sZFJhbmdlKTsK
LSAgICAgICAgdGhpcy5fdXBkYXRlQ2h1bmtzRm9yUmFuZ2VzKG9sZFJhbmdlLCBuZXdSYW5nZSk7
Ci0gICAgICAgIHRoaXMuX3VwZGF0ZUhpZ2hsaWdodHNGb3JSYW5nZShuZXdSYW5nZSk7Ci0gICAg
ICAgIHRoaXMuZW5kRG9tVXBkYXRlcygpOwotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcGFy
YW0ge1dlYkluc3BlY3Rvci5UZXh0UmFuZ2V9IHJhbmdlCi0gICAgICogQHBhcmFtIHtzdHJpbmd9
IHRleHQKLSAgICAgKi8KLSAgICBfZWRpdFJhbmdlOiBmdW5jdGlvbihyYW5nZSwgdGV4dCkKLSAg
ICB7Ci0gICAgICAgIGlmICh0aGlzLl9sYXN0RWRpdGVkUmFuZ2UgJiYgKCF0ZXh0IHx8IHRleHQu
aW5kZXhPZigiXG4iKSAhPT0gLTEgfHwgdGhpcy5fbGFzdEVkaXRlZFJhbmdlLmVuZExpbmUgIT09
IHJhbmdlLnN0YXJ0TGluZSB8fCB0aGlzLl9sYXN0RWRpdGVkUmFuZ2UuZW5kQ29sdW1uICE9PSBy
YW5nZS5zdGFydENvbHVtbikpCi0gICAgICAgICAgICB0aGlzLl90ZXh0TW9kZWwubWFya1VuZG9h
YmxlU3RhdGUoKTsKLQotICAgICAgICB2YXIgbmV3UmFuZ2UgPSB0aGlzLl90ZXh0TW9kZWwuZWRp
dFJhbmdlKHJhbmdlLCB0ZXh0KTsKLSAgICAgICAgdGhpcy5fbGFzdEVkaXRlZFJhbmdlID0gbmV3
UmFuZ2U7Ci0KLSAgICAgICAgcmV0dXJuIG5ld1JhbmdlOwotICAgIH0sCi0KLSAgICAvKioKLSAg
ICAgKiBAcGFyYW0ge1dlYkluc3BlY3Rvci5UZXh0UmFuZ2V9IHJhbmdlCi0gICAgICovCi0gICAg
X3JlbW92ZURlY29yYXRpb25zSW5SYW5nZTogZnVuY3Rpb24ocmFuZ2UpCi0gICAgewotICAgICAg
ICBmb3IgKHZhciBpID0gdGhpcy5fY2h1bmtOdW1iZXJGb3JMaW5lKHJhbmdlLnN0YXJ0TGluZSk7
IGkgPCB0aGlzLl90ZXh0Q2h1bmtzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICB2YXIgY2h1
bmsgPSB0aGlzLl90ZXh0Q2h1bmtzW2ldOwotICAgICAgICAgICAgaWYgKGNodW5rLnN0YXJ0TGlu
ZSA+IHJhbmdlLmVuZExpbmUpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBj
aHVuay5yZW1vdmVBbGxEZWNvcmF0aW9ucygpOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIC8q
KgotICAgICAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRSYW5nZX0gb2xkUmFuZ2UKLSAgICAg
KiBAcGFyYW0ge1dlYkluc3BlY3Rvci5UZXh0UmFuZ2V9IG5ld1JhbmdlCi0gICAgICovCi0gICAg
X3VwZGF0ZUNodW5rc0ZvclJhbmdlczogZnVuY3Rpb24ob2xkUmFuZ2UsIG5ld1JhbmdlKQotICAg
IHsKLSAgICAgICAgLy8gVXBkYXRlIHRoZSBjaHVua3MgaW4gcmFuZ2U6IGZpcnN0Q2h1bmtOdW1i
ZXIgPD0gaW5kZXggPD0gbGFzdENodW5rTnVtYmVyCi0gICAgICAgIHZhciBmaXJzdENodW5rTnVt
YmVyID0gdGhpcy5fY2h1bmtOdW1iZXJGb3JMaW5lKG9sZFJhbmdlLnN0YXJ0TGluZSk7Ci0gICAg
ICAgIHZhciBsYXN0Q2h1bmtOdW1iZXIgPSBmaXJzdENodW5rTnVtYmVyOwotICAgICAgICB3aGls
ZSAobGFzdENodW5rTnVtYmVyICsgMSA8IHRoaXMuX3RleHRDaHVua3MubGVuZ3RoKSB7Ci0gICAg
ICAgICAgICBpZiAodGhpcy5fdGV4dENodW5rc1tsYXN0Q2h1bmtOdW1iZXIgKyAxXS5zdGFydExp
bmUgPiBvbGRSYW5nZS5lbmRMaW5lKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgKytsYXN0Q2h1bmtOdW1iZXI7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgc3RhcnRMaW5l
ID0gdGhpcy5fdGV4dENodW5rc1tmaXJzdENodW5rTnVtYmVyXS5zdGFydExpbmU7Ci0gICAgICAg
IHZhciBsaW5lc0NvdW50ID0gdGhpcy5fdGV4dENodW5rc1tsYXN0Q2h1bmtOdW1iZXJdLnN0YXJ0
TGluZSArIHRoaXMuX3RleHRDaHVua3NbbGFzdENodW5rTnVtYmVyXS5saW5lc0NvdW50IC0gc3Rh
cnRMaW5lOwotICAgICAgICB2YXIgbGluZXNEaWZmID0gbmV3UmFuZ2UubGluZXNDb3VudCAtIG9s
ZFJhbmdlLmxpbmVzQ291bnQ7Ci0gICAgICAgIGxpbmVzQ291bnQgKz0gbGluZXNEaWZmOwotCi0g
ICAgICAgIGlmIChsaW5lc0RpZmYpIHsKLSAgICAgICAgICAgIC8vIExpbmVzIHNoaWZ0ZWQsIHVw
ZGF0ZSB0aGUgbGluZSBudW1iZXJzIG9mIHRoZSBjaHVua3MgYmVsb3cuCi0gICAgICAgICAgICBm
b3IgKHZhciBjaHVua051bWJlciA9IGxhc3RDaHVua051bWJlciArIDE7IGNodW5rTnVtYmVyIDwg
dGhpcy5fdGV4dENodW5rcy5sZW5ndGg7ICsrY2h1bmtOdW1iZXIpCi0gICAgICAgICAgICAgICAg
dGhpcy5fdGV4dENodW5rc1tjaHVua051bWJlcl0uc3RhcnRMaW5lICs9IGxpbmVzRGlmZjsKLSAg
ICAgICAgfQotCi0gICAgICAgIHZhciBmaXJzdExpbmVSb3c7Ci0gICAgICAgIGlmIChmaXJzdENo
dW5rTnVtYmVyKSB7Ci0gICAgICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLl90ZXh0Q2h1bmtzW2Zp
cnN0Q2h1bmtOdW1iZXIgLSAxXTsKLSAgICAgICAgICAgIGZpcnN0TGluZVJvdyA9IGNodW5rLmV4
cGFuZGVkID8gY2h1bmsuZ2V0RXhwYW5kZWRMaW5lUm93KGNodW5rLnN0YXJ0TGluZSArIGNodW5r
LmxpbmVzQ291bnQgLSAxKSA6IGNodW5rLmVsZW1lbnQ7Ci0gICAgICAgICAgICBmaXJzdExpbmVS
b3cgPSBmaXJzdExpbmVSb3cubmV4dFNpYmxpbmc7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAg
ICAgZmlyc3RMaW5lUm93ID0gdGhpcy5fY29udGFpbmVyLmZpcnN0Q2hpbGQ7Ci0KLSAgICAgICAg
Ly8gTW9zdCBmcmVxdWVudCBjYXNlOiBhIGNodW5rIHJlbWFpbmVkIHRoZSBzYW1lLgotICAgICAg
ICBmb3IgKHZhciBjaHVua051bWJlciA9IGZpcnN0Q2h1bmtOdW1iZXI7IGNodW5rTnVtYmVyIDw9
IGxhc3RDaHVua051bWJlcjsgKytjaHVua051bWJlcikgewotICAgICAgICAgICAgdmFyIGNodW5r
ID0gdGhpcy5fdGV4dENodW5rc1tjaHVua051bWJlcl07Ci0gICAgICAgICAgICBpZiAoY2h1bmsu
c3RhcnRMaW5lICsgY2h1bmsubGluZXNDb3VudCA+IHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50
KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgdmFyIGxpbmVOdW1iZXIgPSBj
aHVuay5zdGFydExpbmU7Ci0gICAgICAgICAgICBmb3IgKHZhciBsaW5lUm93ID0gZmlyc3RMaW5l
Um93OyBsaW5lUm93ICYmIGxpbmVOdW1iZXIgPCBjaHVuay5zdGFydExpbmUgKyBjaHVuay5saW5l
c0NvdW50OyBsaW5lUm93ID0gbGluZVJvdy5uZXh0U2libGluZykgewotICAgICAgICAgICAgICAg
IGlmIChsaW5lUm93LmxpbmVOdW1iZXIgIT09IGxpbmVOdW1iZXIgfHwgbGluZVJvdyAhPT0gY2h1
bmsuZ2V0RXhwYW5kZWRMaW5lUm93KGxpbmVOdW1iZXIpIHx8IGxpbmVSb3cudGV4dENvbnRlbnQg
IT09IHRoaXMuX3RleHRNb2RlbC5saW5lKGxpbmVOdW1iZXIpIHx8ICFsaW5lUm93LmZpcnN0Q2hp
bGQpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICsrbGluZU51
bWJlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyIDwgY2h1bmsu
c3RhcnRMaW5lICsgY2h1bmsubGluZXNDb3VudCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIGNodW5rLnVwZGF0ZUNvbGxhcHNlZExpbmVSb3coKTsKLSAgICAgICAgICAgICsr
Zmlyc3RDaHVua051bWJlcjsKLSAgICAgICAgICAgIGZpcnN0TGluZVJvdyA9IGxpbmVSb3c7Ci0g
ICAgICAgICAgICBzdGFydExpbmUgKz0gY2h1bmsubGluZXNDb3VudDsKLSAgICAgICAgICAgIGxp
bmVzQ291bnQgLT0gY2h1bmsubGluZXNDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChm
aXJzdENodW5rTnVtYmVyID4gbGFzdENodW5rTnVtYmVyICYmIGxpbmVzQ291bnQgPT09IDApCi0g
ICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gTWF5YmUgbWVyZ2Ugd2l0aCB0aGUgbmV4
dCBjaHVuaywgc28gdGhhdCB3ZSBzaG91bGQgbm90IGNyZWF0ZSAxLXNpemVkIGNodW5rcyB3aGVu
IGFwcGVuZGluZyBuZXcgbGluZXMgb25lIGJ5IG9uZS4KLSAgICAgICAgdmFyIGNodW5rID0gdGhp
cy5fdGV4dENodW5rc1tsYXN0Q2h1bmtOdW1iZXIgKyAxXTsKLSAgICAgICAgdmFyIGxpbmVzSW5M
YXN0Q2h1bmsgPSBsaW5lc0NvdW50ICUgdGhpcy5fZGVmYXVsdENodW5rU2l6ZTsKLSAgICAgICAg
aWYgKGNodW5rICYmICFjaHVuay5kZWNvcmF0ZWQgJiYgbGluZXNJbkxhc3RDaHVuayA+IDAgJiYg
bGluZXNJbkxhc3RDaHVuayArIGNodW5rLmxpbmVzQ291bnQgPD0gdGhpcy5fZGVmYXVsdENodW5r
U2l6ZSkgewotICAgICAgICAgICAgKytsYXN0Q2h1bmtOdW1iZXI7Ci0gICAgICAgICAgICBsaW5l
c0NvdW50ICs9IGNodW5rLmxpbmVzQ291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgc2Ny
b2xsVG9wID0gdGhpcy5lbGVtZW50LnNjcm9sbFRvcDsKLSAgICAgICAgdmFyIHNjcm9sbExlZnQg
PSB0aGlzLmVsZW1lbnQuc2Nyb2xsTGVmdDsKLQotICAgICAgICAvLyBEZWxldGUgYWxsIERPTSBl
bGVtZW50cyB0aGF0IHdlcmUgZWl0aGVyIGNvbnRyb2xsZWQgYnkgdGhlIG9sZCBjaHVua3MsIG9y
IGhhdmUganVzdCBiZWVuIGluc2VydGVkLgotICAgICAgICB2YXIgZmlyc3RVbm1vZGlmaWVkTGlu
ZVJvdyA9IG51bGw7Ci0gICAgICAgIGNodW5rID0gdGhpcy5fdGV4dENodW5rc1tsYXN0Q2h1bmtO
dW1iZXIgKyAxXTsKLSAgICAgICAgaWYgKGNodW5rKQotICAgICAgICAgICAgZmlyc3RVbm1vZGlm
aWVkTGluZVJvdyA9IGNodW5rLmV4cGFuZGVkID8gY2h1bmsuZ2V0RXhwYW5kZWRMaW5lUm93KGNo
dW5rLnN0YXJ0TGluZSkgOiBjaHVuay5lbGVtZW50OwotCi0gICAgICAgIHdoaWxlIChmaXJzdExp
bmVSb3cgJiYgZmlyc3RMaW5lUm93ICE9PSBmaXJzdFVubW9kaWZpZWRMaW5lUm93KSB7Ci0gICAg
ICAgICAgICB2YXIgbGluZVJvdyA9IGZpcnN0TGluZVJvdzsKLSAgICAgICAgICAgIGZpcnN0TGlu
ZVJvdyA9IGZpcnN0TGluZVJvdy5uZXh0U2libGluZzsKLSAgICAgICAgICAgIHRoaXMuX2NvbnRh
aW5lci5yZW1vdmVDaGlsZChsaW5lUm93KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlcGxh
Y2Ugb2xkIGNodW5rcyB3aXRoIHRoZSBuZXcgb25lcy4KLSAgICAgICAgZm9yICh2YXIgY2h1bmtO
dW1iZXIgPSBmaXJzdENodW5rTnVtYmVyOyBsaW5lc0NvdW50ID4gMDsgKytjaHVua051bWJlcikg
ewotICAgICAgICAgICAgdmFyIGNodW5rTGluZXNDb3VudCA9IE1hdGgubWluKHRoaXMuX2RlZmF1
bHRDaHVua1NpemUsIGxpbmVzQ291bnQpOwotICAgICAgICAgICAgdmFyIG5ld0NodW5rID0gdGhp
cy5fY3JlYXRlTmV3Q2h1bmsoc3RhcnRMaW5lLCBzdGFydExpbmUgKyBjaHVua0xpbmVzQ291bnQp
OwotICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmluc2VydEJlZm9yZShuZXdDaHVuay5lbGVt
ZW50LCBmaXJzdFVubW9kaWZpZWRMaW5lUm93KTsKLQotICAgICAgICAgICAgaWYgKGNodW5rTnVt
YmVyIDw9IGxhc3RDaHVua051bWJlcikKLSAgICAgICAgICAgICAgICB0aGlzLl90ZXh0Q2h1bmtz
W2NodW5rTnVtYmVyXSA9IG5ld0NodW5rOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIHRoaXMuX3RleHRDaHVua3Muc3BsaWNlKGNodW5rTnVtYmVyLCAwLCBuZXdDaHVuayk7Ci0g
ICAgICAgICAgICBzdGFydExpbmUgKz0gY2h1bmtMaW5lc0NvdW50OwotICAgICAgICAgICAgbGlu
ZXNDb3VudCAtPSBjaHVua0xpbmVzQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNodW5r
TnVtYmVyIDw9IGxhc3RDaHVua051bWJlcikKLSAgICAgICAgICAgIHRoaXMuX3RleHRDaHVua3Mu
c3BsaWNlKGNodW5rTnVtYmVyLCBsYXN0Q2h1bmtOdW1iZXIgLSBjaHVua051bWJlciArIDEpOwot
Ci0gICAgICAgIHRoaXMuZWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7Ci0gICAgICAgIHRo
aXMuZWxlbWVudC5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDsKLSAgICB9LAotCi0gICAgLyoqCi0g
ICAgICogQHBhcmFtIHtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlfSByYW5nZQotICAgICAqLwotICAg
IF91cGRhdGVIaWdobGlnaHRzRm9yUmFuZ2U6IGZ1bmN0aW9uKHJhbmdlKQotICAgIHsKLSAgICAg
ICAgdmFyIHZpc2libGVGcm9tID0gdGhpcy5lbGVtZW50LnNjcm9sbFRvcDsKLSAgICAgICAgdmFy
IHZpc2libGVUbyA9IHRoaXMuZWxlbWVudC5zY3JvbGxUb3AgKyB0aGlzLmVsZW1lbnQuY2xpZW50
SGVpZ2h0OwotCi0gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9maW5kVmlzaWJsZUNodW5rcyh2
aXNpYmxlRnJvbSwgdmlzaWJsZVRvKTsKLSAgICAgICAgdmFyIGNodW5rID0gdGhpcy5fdGV4dENo
dW5rc1tyZXN1bHQuZW5kIC0gMV07Ci0gICAgICAgIHZhciBsYXN0VmlzaWJsZUxpbmUgPSBjaHVu
ay5zdGFydExpbmUgKyBjaHVuay5saW5lc0NvdW50OwotCi0gICAgICAgIGxhc3RWaXNpYmxlTGlu
ZSA9IE1hdGgubWF4KGxhc3RWaXNpYmxlTGluZSwgcmFuZ2UuZW5kTGluZSArIDEpOwotICAgICAg
ICBsYXN0VmlzaWJsZUxpbmUgPSBNYXRoLm1pbihsYXN0VmlzaWJsZUxpbmUsIHRoaXMuX3RleHRN
b2RlbC5saW5lc0NvdW50KTsKLQotICAgICAgICB2YXIgdXBkYXRlZCA9IHRoaXMuX2hpZ2hsaWdo
dGVyLnVwZGF0ZUhpZ2hsaWdodChyYW5nZS5zdGFydExpbmUsIGxhc3RWaXNpYmxlTGluZSk7Ci0g
ICAgICAgIGlmICghdXBkYXRlZCkgewotICAgICAgICAgICAgLy8gSGlnaGxpZ2h0cyBmb3IgdGhl
IGNodW5rcyBiZWxvdyBhcmUgaW52YWxpZCwgc28ganVzdCBjb2xsYXBzZSB0aGVtLgotICAgICAg
ICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX2NodW5rTnVtYmVyRm9yTGluZShyYW5nZS5zdGFydExp
bmUpOyBpIDwgdGhpcy5fdGV4dENodW5rcy5sZW5ndGg7ICsraSkKLSAgICAgICAgICAgICAgICB0
aGlzLl90ZXh0Q2h1bmtzW2ldLmV4cGFuZGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAg
ICB0aGlzLl9yZXBhaW50QWxsKCk7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB7
QXJyYXkuPHN0cmluZz59IGxpbmVzCi0gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50Ci0g
ICAgICovCi0gICAgX2NvbGxlY3RMaW5lc0Zyb21EaXY6IGZ1bmN0aW9uKGxpbmVzLCBlbGVtZW50
KQotICAgIHsKLSAgICAgICAgdmFyIHRleHRDb250ZW50cyA9IFtdOwotICAgICAgICB2YXIgbm9k
ZSA9IGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFID8gZWxlbWVudCA6IGVsZW1l
bnQudHJhdmVyc2VOZXh0Tm9kZShlbGVtZW50KTsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAg
ICAgICAgICAgIGlmIChlbGVtZW50LmRlY29yYXRpb25zRWxlbWVudCA9PT0gbm9kZSkgewotICAg
ICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9M
b3dlckNhc2UoKSA9PT0gImJyIikKLSAgICAgICAgICAgICAgICB0ZXh0Q29udGVudHMucHVzaCgi
XG4iKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9O
T0RFKQotICAgICAgICAgICAgICAgIHRleHRDb250ZW50cy5wdXNoKG5vZGUudGV4dENvbnRlbnQp
OwotICAgICAgICAgICAgbm9kZSA9IG5vZGUudHJhdmVyc2VOZXh0Tm9kZShlbGVtZW50KTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHZhciB0ZXh0Q29udGVudCA9IHRleHRDb250ZW50cy5qb2luKCIi
KTsKLSAgICAgICAgLy8gVGhlIGxhc3QgXG4gKGlmIGFueSkgZG9lcyBub3QgImNvdW50IiBpbiBh
IERJVi4KLSAgICAgICAgdGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudC5yZXBsYWNlKC9cbiQvLCAi
Iik7Ci0KLSAgICAgICAgdGV4dENvbnRlbnRzID0gdGV4dENvbnRlbnQuc3BsaXQoIlxuIik7Ci0g
ICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dENvbnRlbnRzLmxlbmd0aDsgKytpKQotICAg
ICAgICAgICAgbGluZXMucHVzaCh0ZXh0Q29udGVudHNbaV0pOwotICAgIH0KLX0KLQotV2ViSW5z
cGVjdG9yLlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlLl9fcHJvdG9fXyA9IFdlYkluc3Bl
Y3Rvci5UZXh0RWRpdG9yQ2h1bmtlZFBhbmVsLnByb3RvdHlwZTsKLQotLyoqCi0gKiBAY29uc3Ry
dWN0b3IKLSAqIEBwYXJhbSB7V2ViSW5zcGVjdG9yLlRleHRFZGl0b3JDaHVua2VkUGFuZWx9IGNo
dW5rZWRQYW5lbAotICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0TGluZQotICogQHBhcmFtIHtudW1i
ZXJ9IGVuZExpbmUKLSovCi1XZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5DaHVuayA9IGZ1bmN0
aW9uKGNodW5rZWRQYW5lbCwgc3RhcnRMaW5lLCBlbmRMaW5lKQotewotICAgIHRoaXMuX2NodW5r
ZWRQYW5lbCA9IGNodW5rZWRQYW5lbDsKLSAgICB0aGlzLl90ZXh0TW9kZWwgPSBjaHVua2VkUGFu
ZWwuX3RleHRNb2RlbDsKLQotICAgIHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoImRpdiIpOwotICAgIHRoaXMuZWxlbWVudC5saW5lTnVtYmVyID0gc3RhcnRMaW5lOwotICAg
IHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAid2Via2l0LWxpbmUtY29udGVudCI7Ci0gICAgdGhp
cy5fY2h1bmtlZFBhbmVsLl9lbmFibGVET01Ob2RlUmVtb3ZlZExpc3RlbmVyKHRoaXMuZWxlbWVu
dCwgdHJ1ZSk7Ci0KLSAgICB0aGlzLl9zdGFydExpbmUgPSBzdGFydExpbmU7Ci0gICAgZW5kTGlu
ZSA9IE1hdGgubWluKHRoaXMuX3RleHRNb2RlbC5saW5lc0NvdW50LCBlbmRMaW5lKTsKLSAgICB0
aGlzLmxpbmVzQ291bnQgPSBlbmRMaW5lIC0gc3RhcnRMaW5lOwotCi0gICAgdGhpcy5fZXhwYW5k
ZWQgPSBmYWxzZTsKLSAgICB0aGlzLl9yZWFkT25seSA9IGZhbHNlOwotCi0gICAgdGhpcy51cGRh
dGVDb2xsYXBzZWRMaW5lUm93KCk7Ci19Ci0KLVdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTWFpbkNo
dW5rLnByb3RvdHlwZSA9IHsKLSAgICBhZGREZWNvcmF0aW9uOiBmdW5jdGlvbihkZWNvcmF0aW9u
KQotICAgIHsKLSAgICAgICAgdGhpcy5fY2h1bmtlZFBhbmVsLmJlZ2luRG9tVXBkYXRlcygpOwot
ICAgICAgICBpZiAodHlwZW9mIGRlY29yYXRpb24gPT09ICJzdHJpbmciKQotICAgICAgICAgICAg
dGhpcy5lbGVtZW50LmFkZFN0eWxlQ2xhc3MoZGVjb3JhdGlvbik7Ci0gICAgICAgIGVsc2Ugewot
ICAgICAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQuZGVjb3JhdGlvbnNFbGVtZW50KSB7Ci0gICAg
ICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRlY29yYXRpb25zRWxlbWVudCA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoImRpdiIpOwotICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kZWNvcmF0
aW9uc0VsZW1lbnQuY2xhc3NOYW1lID0gIndlYmtpdC1saW5lLWRlY29yYXRpb25zIjsKLSAgICAg
ICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50LmRlY29yYXRp
b25zRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGVj
b3JhdGlvbnNFbGVtZW50LmFwcGVuZENoaWxkKGRlY29yYXRpb24pOwotICAgICAgICB9Ci0gICAg
ICAgIHRoaXMuX2NodW5rZWRQYW5lbC5lbmREb21VcGRhdGVzKCk7Ci0gICAgfSwKLQotICAgIC8q
KgotICAgICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IGRlY29yYXRpb24KLSAgICAgKi8KLSAg
ICByZW1vdmVEZWNvcmF0aW9uOiBmdW5jdGlvbihkZWNvcmF0aW9uKQotICAgIHsKLSAgICAgICAg
dGhpcy5fY2h1bmtlZFBhbmVsLmJlZ2luRG9tVXBkYXRlcygpOwotICAgICAgICBpZiAodHlwZW9m
IGRlY29yYXRpb24gPT09ICJzdHJpbmciKQotICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92
ZVN0eWxlQ2xhc3MoZGVjb3JhdGlvbik7Ci0gICAgICAgIGVsc2UgaWYgKHRoaXMuZWxlbWVudC5k
ZWNvcmF0aW9uc0VsZW1lbnQpCi0gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGVjb3JhdGlvbnNF
bGVtZW50LnJlbW92ZUNoaWxkKGRlY29yYXRpb24pOwotICAgICAgICB0aGlzLl9jaHVua2VkUGFu
ZWwuZW5kRG9tVXBkYXRlcygpOwotICAgIH0sCi0KLSAgICByZW1vdmVBbGxEZWNvcmF0aW9uczog
ZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdGhpcy5fY2h1bmtlZFBhbmVsLmJlZ2luRG9tVXBk
YXRlcygpOwotICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gIndlYmtpdC1saW5lLWNv
bnRlbnQiOwotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmRlY29yYXRpb25zRWxlbWVudCkgewot
ICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudC5kZWNvcmF0
aW9uc0VsZW1lbnQpOwotICAgICAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudC5kZWNvcmF0aW9u
c0VsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5fY2h1bmtlZFBhbmVsLmVuZERvbVVw
ZGF0ZXMoKTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB7Ym9vbGVhbn0KLSAg
ICAgKi8KLSAgICBnZXQgZGVjb3JhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmVs
ZW1lbnQuY2xhc3NOYW1lICE9PSAid2Via2l0LWxpbmUtY29udGVudCIgfHwgISEodGhpcy5lbGVt
ZW50LmRlY29yYXRpb25zRWxlbWVudCAmJiB0aGlzLmVsZW1lbnQuZGVjb3JhdGlvbnNFbGVtZW50
LmZpcnN0Q2hpbGQpOwotICAgIH0sCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHtudW1iZXJ9
Ci0gICAgICovCi0gICAgZ2V0IHN0YXJ0TGluZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhp
cy5fc3RhcnRMaW5lOwotICAgIH0sCi0KLSAgICBzZXQgc3RhcnRMaW5lKHN0YXJ0TGluZSkKLSAg
ICB7Ci0gICAgICAgIHRoaXMuX3N0YXJ0TGluZSA9IHN0YXJ0TGluZTsKLSAgICAgICAgdGhpcy5l
bGVtZW50LmxpbmVOdW1iZXIgPSBzdGFydExpbmU7Ci0gICAgICAgIGlmICh0aGlzLl9leHBhbmRl
ZExpbmVSb3dzKSB7Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2V4cGFu
ZGVkTGluZVJvd3MubGVuZ3RoOyArK2kpCi0gICAgICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWRM
aW5lUm93c1tpXS5saW5lTnVtYmVyID0gc3RhcnRMaW5lICsgaTsKLSAgICAgICAgfQotICAgIH0s
Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHtib29sZWFufQotICAgICAqLwotICAgIGdldCBl
eHBhbmRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kZWQ7Ci0gICAgfSwK
LQotICAgIHNldCBleHBhbmRlZChleHBhbmRlZCkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLl9l
eHBhbmRlZCA9PT0gZXhwYW5kZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgdGhp
cy5fZXhwYW5kZWQgPSBleHBhbmRlZDsKLQotICAgICAgICBpZiAodGhpcy5saW5lc0NvdW50ID09
PSAxKSB7Ci0gICAgICAgICAgICBpZiAoZXhwYW5kZWQpCi0gICAgICAgICAgICAgICAgdGhpcy5f
Y2h1bmtlZFBhbmVsLl9wYWludExpbmUodGhpcy5lbGVtZW50KTsKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuX2NodW5rZWRQYW5lbC5iZWdpbkRvbVVwZGF0
ZXMoKTsKLQotICAgICAgICBpZiAoZXhwYW5kZWQpIHsKLSAgICAgICAgICAgIHRoaXMuX2V4cGFu
ZGVkTGluZVJvd3MgPSBbXTsKLSAgICAgICAgICAgIHZhciBwYXJlbnRFbGVtZW50ID0gdGhpcy5l
bGVtZW50LnBhcmVudEVsZW1lbnQ7Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5zdGFy
dExpbmU7IGkgPCB0aGlzLnN0YXJ0TGluZSArIHRoaXMubGluZXNDb3VudDsgKytpKSB7Ci0gICAg
ICAgICAgICAgICAgdmFyIGxpbmVSb3cgPSB0aGlzLl9jcmVhdGVSb3coaSk7Ci0gICAgICAgICAg
ICAgICAgdGhpcy5fY2h1bmtlZFBhbmVsLl9lbmFibGVET01Ob2RlUmVtb3ZlZExpc3RlbmVyKGxp
bmVSb3csIHRydWUpOwotICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVsZW1lbnRSZWFkT25s
eVN0YXRlKGxpbmVSb3cpOwotICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuaW5zZXJ0QmVm
b3JlKGxpbmVSb3csIHRoaXMuZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5fZXhwYW5k
ZWRMaW5lUm93cy5wdXNoKGxpbmVSb3cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhp
cy5fY2h1bmtlZFBhbmVsLl9lbmFibGVET01Ob2RlUmVtb3ZlZExpc3RlbmVyKHRoaXMuZWxlbWVu
dCwgZmFsc2UpOwotICAgICAgICAgICAgcGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmVs
ZW1lbnQpOwotICAgICAgICAgICAgdGhpcy5fY2h1bmtlZFBhbmVsLl9wYWludExpbmVzKHRoaXMu
c3RhcnRMaW5lLCB0aGlzLnN0YXJ0TGluZSArIHRoaXMubGluZXNDb3VudCk7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICB2YXIgZWxlbWVudEluc2VydGVkID0gZmFsc2U7Ci0gICAgICAg
ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2V4cGFuZGVkTGluZVJvd3MubGVuZ3RoOyAr
K2kpIHsKLSAgICAgICAgICAgICAgICB2YXIgbGluZVJvdyA9IHRoaXMuX2V4cGFuZGVkTGluZVJv
d3NbaV07Ci0gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtlZFBhbmVsLl9lbmFibGVET01Ob2Rl
UmVtb3ZlZExpc3RlbmVyKGxpbmVSb3csIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB2YXIgcGFy
ZW50RWxlbWVudCA9IGxpbmVSb3cucGFyZW50RWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAo
cGFyZW50RWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRJbnNlcnRl
ZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluc2VydGVkID0gdHJ1ZTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NodW5rZWRQYW5lbC5fZW5hYmxlRE9NTm9kZVJl
bW92ZWRMaXN0ZW5lcih0aGlzLmVsZW1lbnQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgcGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBsaW5lUm93KTsKLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LnJl
bW92ZUNoaWxkKGxpbmVSb3cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0
aGlzLl9jaHVua2VkUGFuZWwuX3JlbGVhc2VMaW5lc0hpZ2hsaWdodChsaW5lUm93KTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9leHBhbmRlZExpbmVSb3dzOwotICAg
ICAgICB9Ci0KLSAgICAgICAgdGhpcy5fY2h1bmtlZFBhbmVsLmVuZERvbVVwZGF0ZXMoKTsKLSAg
ICB9LAotCi0gICAgc2V0IHJlYWRPbmx5KHJlYWRPbmx5KQotICAgIHsKLSAgICAgICAgaWYgKHRo
aXMuX3JlYWRPbmx5ID09PSByZWFkT25seSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAg
ICB0aGlzLl9yZWFkT25seSA9IHJlYWRPbmx5OwotICAgICAgICB0aGlzLl91cGRhdGVFbGVtZW50
UmVhZE9ubHlTdGF0ZSh0aGlzLmVsZW1lbnQpOwotICAgICAgICBpZiAodGhpcy5fZXhwYW5kZWRM
aW5lUm93cykgewotICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9leHBhbmRl
ZExpbmVSb3dzLmxlbmd0aDsgKytpKQotICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVsZW1l
bnRSZWFkT25seVN0YXRlKHRoaXMuX2V4cGFuZGVkTGluZVJvd3NbaV0pOwotICAgICAgICB9Ci0g
ICAgfSwKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4ge2Jvb2xlYW59Ci0gICAgICovCi0gICAg
Z2V0IHJlYWRPbmx5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLl9yZWFkT25seTsKLSAg
ICB9LAotCi0gICAgX3VwZGF0ZUVsZW1lbnRSZWFkT25seVN0YXRlOiBmdW5jdGlvbihlbGVtZW50
KQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuX3JlYWRPbmx5KQotICAgICAgICAgICAgZWxlbWVu
dC5hZGRTdHlsZUNsYXNzKCJ0ZXh0LWVkaXRvci1yZWFkLW9ubHkiKTsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVTdHlsZUNsYXNzKCJ0ZXh0LWVkaXRvci1yZWFkLW9u
bHkiKTsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB7bnVtYmVyfQotICAgICAq
LwotICAgIGdldCBoZWlnaHQoKQotICAgIHsKLSAgICAgICAgaWYgKCF0aGlzLl9leHBhbmRlZExp
bmVSb3dzKQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NodW5rZWRQYW5lbC5fdG90YWxIZWln
aHQodGhpcy5lbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIHRoaXMuX2NodW5rZWRQYW5lbC5fdG90
YWxIZWlnaHQodGhpcy5fZXhwYW5kZWRMaW5lUm93c1swXSwgdGhpcy5fZXhwYW5kZWRMaW5lUm93
c1t0aGlzLl9leHBhbmRlZExpbmVSb3dzLmxlbmd0aCAtIDFdKTsKLSAgICB9LAotCi0gICAgLyoq
Ci0gICAgICogQHJldHVybiB7bnVtYmVyfQotICAgICAqLwotICAgIGdldCBvZmZzZXRUb3AoKQot
ICAgIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLl9leHBhbmRlZExpbmVSb3dzICYmIHRoaXMuX2V4
cGFuZGVkTGluZVJvd3MubGVuZ3RoKSA/IHRoaXMuX2V4cGFuZGVkTGluZVJvd3NbMF0ub2Zmc2V0
VG9wIDogdGhpcy5lbGVtZW50Lm9mZnNldFRvcDsKLSAgICB9LAotCi0gICAgLyoqCi0gICAgICog
QHBhcmFtIHtudW1iZXJ9IGxpbmVOdW1iZXIKLSAgICAgKiBAcmV0dXJuIHtFbGVtZW50fQotICAg
ICAqLwotICAgIF9jcmVhdGVSb3c6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCi0gICAgewotICAgICAg
ICB2YXIgbGluZVJvdyA9IHRoaXMuX2NodW5rZWRQYW5lbC5fY2FjaGVkUm93cy5wb3AoKSB8fCBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKLSAgICAgICAgbGluZVJvdy5saW5lTnVtYmVy
ID0gbGluZU51bWJlcjsKLSAgICAgICAgbGluZVJvdy5jbGFzc05hbWUgPSAid2Via2l0LWxpbmUt
Y29udGVudCI7Ci0gICAgICAgIGxpbmVSb3cudGV4dENvbnRlbnQgPSB0aGlzLl90ZXh0TW9kZWwu
bGluZShsaW5lTnVtYmVyKTsKLSAgICAgICAgaWYgKCFsaW5lUm93LnRleHRDb250ZW50KQotICAg
ICAgICAgICAgbGluZVJvdy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIp
KTsKLSAgICAgICAgcmV0dXJuIGxpbmVSb3c7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAqIEBw
YXJhbSB7bnVtYmVyfSBsaW5lTnVtYmVyCi0gICAgICogQHJldHVybiB7RWxlbWVudH0KLSAgICAg
Ki8KLSAgICBnZXRFeHBhbmRlZExpbmVSb3c6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCi0gICAgewot
ICAgICAgICBpZiAoIXRoaXMuX2V4cGFuZGVkIHx8IGxpbmVOdW1iZXIgPCB0aGlzLnN0YXJ0TGlu
ZSB8fCBsaW5lTnVtYmVyID49IHRoaXMuc3RhcnRMaW5lICsgdGhpcy5saW5lc0NvdW50KQotICAg
ICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGlmICghdGhpcy5fZXhwYW5kZWRMaW5lUm93
cykKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQ7Ci0gICAgICAgIHJldHVybiB0aGlz
Ll9leHBhbmRlZExpbmVSb3dzW2xpbmVOdW1iZXIgLSB0aGlzLnN0YXJ0TGluZV07Ci0gICAgfSwK
LQotICAgIHVwZGF0ZUNvbGxhcHNlZExpbmVSb3c6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAg
IGlmICh0aGlzLmxpbmVzQ291bnQgPT09IDEgJiYgdGhpcy5fZXhwYW5kZWQpCi0gICAgICAgICAg
ICByZXR1cm47Ci0KLSAgICAgICAgdmFyIGxpbmVzID0gW107Ci0gICAgICAgIGZvciAodmFyIGkg
PSB0aGlzLnN0YXJ0TGluZTsgaSA8IHRoaXMuc3RhcnRMaW5lICsgdGhpcy5saW5lc0NvdW50OyAr
K2kpCi0gICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuX3RleHRNb2RlbC5saW5lKGkpKTsKLQot
ICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICAgICAgdGhpcy5lbGVt
ZW50LnRleHRDb250ZW50ID0gbGluZXMuam9pbigiXG4iKTsKLQotICAgICAgICAvLyBUaGUgbGFz
dCBlbXB0eSBsaW5lIHdpbGwgZ2V0IHN3YWxsb3dlZCBvdGhlcndpc2UuCi0gICAgICAgIGlmICgh
bGluZXNbbGluZXMubGVuZ3RoIC0gMV0pCi0gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5k
Q2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9XZWJLaXQucXJjIGIvU291cmNl
L1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9XZWJLaXQucXJjCmluZGV4IGYxZTlkMjI0MjM2
OGE0MTNmZGE4NzgyZjMxMTBmYzE2ODU1ZjBkMzcuLmQ2Mzg5YzUyY2FjY2Q5NWYxMGEyOGEwMjdj
OTJkNDM5YjViNDc0MWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9u
dC1lbmQvV2ViS2l0LnFyYworKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5k
L1dlYktpdC5xcmMKQEAgLTM4LDYgKzM4LDcgQEAKICAgICA8ZmlsZT5EYXRhR3JpZC5qczwvZmls
ZT4KICAgICA8ZmlsZT5EZWJ1Z2dlck1vZGVsLmpzPC9maWxlPgogICAgIDxmaWxlPkRlYnVnZ2Vy
U2NyaXB0TWFwcGluZy5qczwvZmlsZT4KKyAgICA8ZmlsZT5EZWZhdWx0VGV4dEVkaXRvci5qczwv
ZmlsZT4KICAgICA8ZmlsZT5EaWFsb2cuanM8L2ZpbGU+CiAgICAgPGZpbGU+RGlyZWN0b3J5Q29u
dGVudFZpZXcuanM8L2ZpbGU+CiAgICAgPGZpbGU+RE9NQWdlbnQuanM8L2ZpbGU+CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sIGIv
U291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbAppbmRleCAw
MDFiOWU2OTI3N2U1YThkODlhZDY3YTQ3NmNmZTI4Y2ZlMDM5NWViLi4wYmM3OWExZjU1MTU0MjBl
Yjg1NTUwYTc0ZTc2NWZlNzQwZTZmZDA0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNw
ZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0bWwKQEAgLTExOSw2ICsxMTksNyBAQCBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkVsZW1lbnRzUGFuZWwu
anMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ik5l
dHdvcmtQYW5lbC5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp
cHQiIHNyYz0iVGV4dEVkaXRvci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0
L2phdmFzY3JpcHQiIHNyYz0iRGVmYXVsdFRleHRFZGl0b3IuanMiPjwvc2NyaXB0PgogICAgIDxz
Y3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IlNvdXJjZUZyYW1lLmpzIj48L3Njcmlw
dD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJVSVNvdXJjZUNvZGVG
cmFtZS5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNy
Yz0iUmVzb3VyY2VWaWV3LmpzIj48L3NjcmlwdD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>