<?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>116795</bug_id>
          
          <creation_ts>2013-05-26 13:56:16 -0700</creation_ts>
          <short_desc>Remove ENABLE_CALENDAR_PICKER</short_desc>
          <delta_ts>2013-05-27 15:06:34 -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>Forms</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kent Tamura">tkent</reporter>
          <assigned_to name="Kent Tamura">tkent</assigned_to>
          <cc>commit-queue</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>893808</commentid>
    <comment_count>0</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2013-05-26 13:56:16 -0700</bug_when>
    <thetext>Remove ENABLE_CALENDAR_PICKER</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893810</commentid>
    <comment_count>1</comment_count>
      <attachid>202929</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2013-05-26 14:52:27 -0700</bug_when>
    <thetext>Created attachment 202929
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893813</commentid>
    <comment_count>2</comment_count>
      <attachid>202929</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-05-26 15:35:42 -0700</bug_when>
    <thetext>Comment on attachment 202929
Patch

Clearing flags on attachment: 202929

Committed r150724: &lt;http://trac.webkit.org/changeset/150724&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>893814</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-05-26 15:35:43 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>894101</commentid>
    <comment_count>4</comment_count>
      <attachid>202929</attachid>
    <who name="Robert Hogan">robert</who>
    <bug_when>2013-05-27 11:38:17 -0700</bug_when>
    <thetext>Comment on attachment 202929
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=202929&amp;action=review

&gt; Source/WebKit/blackberry/WebCoreSupport/AboutDataEnableFeatures.in:-17
&gt; -CALENDAR_PICKER

Doesn&apos;t this remove this feature from the blackberry port? Shouldn&apos;t they have sight of this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>894169</commentid>
    <comment_count>5</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2013-05-27 15:06:34 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 202929 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=202929&amp;action=review
&gt; 
&gt; &gt; Source/WebKit/blackberry/WebCoreSupport/AboutDataEnableFeatures.in:-17
&gt; &gt; -CALENDAR_PICKER
&gt; 
&gt; Doesn&apos;t this remove this feature from the blackberry port? Shouldn&apos;t they have sight of this?

Blackberry port has never enabled CALENDAR_PICKER AFAIK.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>202929</attachid>
            <date>2013-05-26 14:52:27 -0700</date>
            <delta_ts>2013-05-27 11:38:17 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-116795-20130527065108.patch</filename>
            <type>text/plain</type>
            <size>143874</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTUwNzE5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IDNmMTY2NGNlZTlmODdkYjU1YjA0NTQ3
MjJhNTg4ZWIzNThmOTIxYzAuLjk1NDgwY2JjMWU2OWI3MWM2ZGI2OGQ2N2NiZDM3YTY2MDBjZGZi
ZTIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTIgQEAKKzIwMTMtMDUtMjYgIEtlbnQgVGFtdXJhICA8dGtlbnRA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJlbW92ZSBFTkFCTEVfQ0FMRU5EQVJfUElDS0VSCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTY3OTUKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHd0Zi9GZWF0
dXJlRGVmaW5lcy5oOgorCiAyMDEzLTA1LTI0ICBCZW5qYW1pbiBQb3VsYWluICA8YnBvdWxhaW5A
YXBwbGUuY29tPgogCiAgICAgICAgIElubGluZSBUQ01hbGxvY19DZW50cmFsX0ZyZWVMaXN0J3Mg
UmVtb3ZlUmFuZ2UgYW5kIEZldGNoRnJvbVNwYW5zU2FmZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDA0YThlZTE5
ZTljNGU3NmNmZTkwNGZhMjE4ODZmZTk0NTMxNjY1MDkuLjFlNTYzZWE1Y2Y4NGY3YmUzOGY0YTRk
MThiZGQyZDQ5YmEzYzgyN2QgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwor
KysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMiBAQAorMjAxMy0wNS0y
NiAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmVtb3ZlIEVO
QUJMRV9DQUxFTkRBUl9QSUNLRVIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTExNjc5NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFRoaXMgZmVhdHVyZSB3YXMgdXNlZCBvbmx5IGJ5IENocm9taXVtIHBvcnQu
CisKKyAgICAgICAgKiBSZXNvdXJjZXMvcGFnZXBvcHVwcy9jYWxlbmRhclBpY2tlci5jc3M6IFJl
bW92ZWQuCisgICAgICAgICogUmVzb3VyY2VzL3BhZ2Vwb3B1cHMvY2FsZW5kYXJQaWNrZXIuanM6
IFJlbW92ZWQuCisgICAgICAgICogY3NzL2h0bWwuY3NzOgorICAgICAgICAqIHBsYXRmb3JtL3Rl
eHQvTG9jYWxlSUNVLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkxvY2FsZUlDVTo6TG9jYWxlSUNV
KToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAqIHBsYXRmb3JtL3RleHQvTG9jYWxlSUNV
Lmg6CisgICAgICAgIChMb2NhbGVJQ1UpOgorICAgICAgICAqIHBsYXRmb3JtL3RleHQvUGxhdGZv
cm1Mb2NhbGUuaDoKKyAgICAgICAgKExvY2FsZSk6CisgICAgICAgICogcGxhdGZvcm0vdGV4dC9t
YWMvTG9jYWxlTWFjLmg6CisgICAgICAgIChMb2NhbGVNYWMpOgorICAgICAgICAqIHBsYXRmb3Jt
L3RleHQvbWFjL0xvY2FsZU1hYy5tbToKKyAgICAgICAgKFdlYkNvcmU6OkxvY2FsZU1hYzo6bW9u
dGhMYWJlbHMpOgorICAgICAgICAqIHBsYXRmb3JtL3RleHQvd2luL0xvY2FsZVdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpMb2NhbGVXaW46OkxvY2FsZVdpbik6CisgICAgICAgIChXZWJDb3Jl
OjpMb2NhbGVXaW46Om1vbnRoTGFiZWxzKToKKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L3dpbi9M
b2NhbGVXaW4uaDoKKyAgICAgICAgKExvY2FsZVdpbik6CisKIDIwMTMtMDUtMjYgIEFudHRpIEtv
aXZpc3RvICA8YW50dGlAYXBwbGUuY29tPgogCiAgICAgICAgIFJlbW92ZSBGb250RmFtaWx5Lmgv
LmNwcApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0NoYW5nZUxvZyBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9DaGFuZ2VMb2cKaW5kZXggZGUxZDFkZjY2ZjM0ZDcyNjNj
MmMxNDlmMWVlM2I4ZWY3ZDk1MGRmMS4uNmRmMDA1YmVlZTUzYzI1M2Q2MWU4NTE3OGQ5ZGM1NDk1
ZTgzZGZjZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0NoYW5nZUxvZwor
KysgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAK
KzIwMTMtMDUtMjYgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAg
IFJlbW92ZSBFTkFCTEVfQ0FMRU5EQVJfUElDS0VSCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTY3OTUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0Fib3V0RGF0YUVuYWJsZUZl
YXR1cmVzLmluOgorICAgICAgICBUaGUgbGlzdCB3YXMgd3JvbmcuIEJsYWNrYmVycnkgcG9ydCBk
b2Vzbid0IHVzZSBDQUxFTkRBUl9QSUNLRVIgY29kZS4KKwogMjAxMy0wNS0yNiAgQW5kcmVhcyBL
bGluZyAgPGFrbGluZ0BhcHBsZS5jb20+CiAKICAgICAgICAgRm9jdXNDb250cm9sbGVyOjpzZXRG
b2N1c2VkTm9kZSgpIHNob3VsZCBiZSBzZXRGb2N1c2VkRWxlbWVudCgpLgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dURi93dGYvRmVhdHVyZURlZmluZXMuaCBiL1NvdXJjZS9XVEYvd3RmL0ZlYXR1cmVE
ZWZpbmVzLmgKaW5kZXggNTY3ZTUzNDk3NmFiNDk2MDZkOTMwZWIzMGYzMzYzZTk1ZjgxZjYxMi4u
MDM1YjViYjE3NTQ1Nzg2Y2E5NDI1MzNhNGRjMGI1MjA0NzAxN2NkYiAxMDA2NDQKLS0tIGEvU291
cmNlL1dURi93dGYvRmVhdHVyZURlZmluZXMuaAorKysgYi9Tb3VyY2UvV1RGL3d0Zi9GZWF0dXJl
RGVmaW5lcy5oCkBAIC0zMDIsMTAgKzMwMiw2IEBACiAjZGVmaW5lIEVOQUJMRV9CTE9CIDAKICNl
bmRpZgogCi0jaWYgIWRlZmluZWQoRU5BQkxFX0NBTEVOREFSX1BJQ0tFUikKLSNkZWZpbmUgRU5B
QkxFX0NBTEVOREFSX1BJQ0tFUiAwCi0jZW5kaWYKLQogI2lmICFkZWZpbmVkKEVOQUJMRV9DQU5W
QVNfUEFUSCkKICNkZWZpbmUgRU5BQkxFX0NBTlZBU19QQVRIIDEKICNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvUmVzb3VyY2VzL3BhZ2Vwb3B1cHMvY2FsZW5kYXJQaWNrZXIuY3Nz
IGIvU291cmNlL1dlYkNvcmUvUmVzb3VyY2VzL3BhZ2Vwb3B1cHMvY2FsZW5kYXJQaWNrZXIuY3Nz
CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjU1Zjk1YWY1ZjVkZTJjMTE2OGZhYjM2
NGUwZjc0ZjZkYTIzYWJhLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1Jlc291cmNlcy9wYWdlcG9wdXBzL2NhbGVuZGFyUGlja2Vy
LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAq
ICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBp
dHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0g
KiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotYm9keSB7Ci0gICAgLXdlYmtpdC11
c2VyLXNlbGVjdDogbm9uZTsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLSAgICBmb250
OiAtd2Via2l0LWNvbnRyb2w7Ci0gICAgZm9udC1zaXplOiAxMnB4OwotfQotCi0ucnRsIHsKLSAg
ICBkaXJlY3Rpb246IHJ0bDsKLX0KLQotLnNjcm9sbC12aWV3IHsKLSAgICBvdmVyZmxvdzogaGlk
ZGVuOwotICAgIHdpZHRoOiAwOwotICAgIGhlaWdodDogMDsKLX0KLQotLmxpc3QtY2VsbCB7Ci0g
ICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIGxlZnQ6IDA7Ci0gICAgdG9wOiAwOwotICAgIHdp
ZHRoOiAwOwotICAgIGhlaWdodDogMDsKLX0KLQotLmxpc3QtY2VsbC5oaWRkZW4gewotICAgIGRp
c3BsYXk6IG5vbmU7Ci19Ci0KLS53ZWVrLW51bWJlci1jZWxsLAotLmRheS1jZWxsIHsKLSAgICBw
b3NpdGlvbjogc3RhdGljOwotICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICBib3gtc2l6aW5n
OiBib3JkZXItYm94OwotICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgICBjdXJzb3I6IGRl
ZmF1bHQ7Ci0gICAgLXdlYmtpdC10cmFuc2l0aW9uOiBjb2xvciAxczsKLSAgICBwYWRkaW5nOiAx
cHg7Ci19Ci0KLS53ZWVrLW51bWJlci1jZWxsIHsKLSAgICBib3gtc2l6aW5nOiBib3JkZXItYm94
OwotICAgIGNvbG9yOiBibGFjazsKLSAgICBwYWRkaW5nLXJpZ2h0OiAwOwotICAgIGJveC1zaGFk
b3c6IDFweCAwIDAgI2JmYmZiZjsKLSAgICBtYXJnaW4tcmlnaHQ6IDFweDsKLX0KLQotLmRheS1j
ZWxsIHsKLSAgICBjb2xvcjogI2JmYmZiZjsKLX0KLQotLmRheS1jZWxsLmhpZ2hsaWdodGVkLnRv
ZGF5LAotLmRheS1jZWxsLnRvZGF5IHsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjYmZiZmJmOwot
ICAgIHBhZGRpbmc6IDA7Ci19Ci0KLS53ZWVrLW51bWJlci1jZWxsLmhpZ2hsaWdodGVkLAotLmRh
eS1jZWxsLmhpZ2hsaWdodGVkIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVlY2Y4OwotfQot
Ci0ud2Vlay1udW1iZXItY2VsbC5oaWdobGlnaHRlZC5kaXNhYmxlZCwKLS5kYXktY2VsbC5oaWdo
bGlnaHRlZC5kaXNhYmxlZCB7Ci0gICAgYm9yZGVyOiAxcHggc29saWQgI2U1ZWNmODsKLSAgICBw
YWRkaW5nOiAwOwotfQotCi0ud2Vlay1udW1iZXItY2VsbC5zZWxlY3RlZCwKLS5kYXktY2VsbC5z
ZWxlY3RlZCB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2JjY2RlYzsKLX0KLQotLndlZWstbnVt
YmVyLWNlbGwuZGlzYWJsZWQsCi0uZGF5LWNlbGwuZGlzYWJsZWQgewotICAgIGJhY2tncm91bmQt
Y29sb3I6ICNmNWY1ZjU7Ci19Ci0KLS5kYXktY2VsbC5jdXJyZW50LW1vbnRoIHsKLSAgICBjb2xv
cjogIzAwMDAwMDsKLX0KLQotLmNhbGVuZGFyLXRhYmxlLXZpZXcgewotICAgIGJvcmRlcjogMXB4
IHNvbGlkICNiZmJmYmY7Ci0gICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICAgIG91dGxpbmU6
IG5vbmU7Ci19Ci0KLS53ZWVrLW51bWJlci1sYWJlbCwKLS53ZWVrLWRheS1sYWJlbCB7Ci0gICAg
dGV4dC1hbGlnbjogY2VudGVyOwotICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLX0KLQotLndl
ZWstbnVtYmVyLWxhYmVsIHsKLSAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwotICAgIGJvcmRl
ci1yaWdodDogMXB4IHNvbGlkICNiZmJmYmY7Ci19Ci0KLS5jYWxlbmRhci10YWJsZS1oZWFkZXIt
dmlldyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKLSAgICBib3JkZXItYm90dG9t
OiAxcHggc29saWQgI2JmYmZiZjsKLSAgICBoZWlnaHQ6IDI0cHg7Ci0gICAgbGluZS1oZWlnaHQ6
IDI0cHg7Ci19Ci0KLS5jYWxlbmRhci1waWNrZXIgewotICAgIGJvcmRlcjogMXB4IHNvbGlkICNi
ZmJmYmY7Ci0gICAgYm9yZGVyLXJhZGl1czogMnB4OwotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsK
LSAgICBwYWRkaW5nOiAxMHB4OwotICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwotICAgIG92
ZXJmbG93OiBoaWRkZW47Ci0gICAgY3Vyc29yOiBkZWZhdWx0OwotfQotCi0uY2FsZW5kYXItaGVh
ZGVyLXZpZXcgewotICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Ci0gICAgZGlzcGxheTogLXdlYmtp
dC1mbGV4OwotICAgIC13ZWJraXQtZmxleC1mbG93OiByb3c7Ci19Ci0KLS5jYWxlbmRhci10aXRs
ZSB7Ci0gICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7Ci0gICAgLXdlYmtpdC1mbGV4OiAx
OwotICAgIHRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5ydGwgLmNhbGVuZGFyLXRpdGxlIHsKLSAg
ICB0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotLm1vbnRoLXBvcHVwLWJ1dHRvbiwKLS5tb250aC1w
b3B1cC1idXR0b246aG92ZXIsCi0ubW9udGgtcG9wdXAtYnV0dG9uOmRpc2FibGVkIHsKLSAgICBi
YWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwotICAgIGJhY2tncm91bmQt
aW1hZ2U6IG5vbmUgIWltcG9ydGFudDsKLSAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7
Ci0gICAgY29sb3I6IGJsYWNrOwotfQotCi0ubW9udGgtcG9wdXAtYnV0dG9uOmRpc2FibGVkIHsK
LSAgICBvcGFjaXR5OiAwLjc7Ci19Ci0KLS5tb250aC1wb3B1cC1idXR0b24gewotICAgIGZvbnQt
c2l6ZTogMTJweDsKLSAgICBwYWRkaW5nOiA0cHg7Ci0gICAgZGlzcGxheTogaW5saW5lLWJsb2Nr
OwotICAgIGN1cnNvcjogZGVmYXVsdDsKLSAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVu
dCAhaW1wb3J0YW50OwotICAgIGhlaWdodDogMjRweCAhaW1wb3J0YW50OwotfQotCi0ubW9udGgt
cG9wdXAtYnV0dG9uIC5kaXNjbG9zdXJlLXRyaWFuZ2xlIHsKLSAgICBtYXJnaW46IDAgNnB4Owot
fQotCi0ubW9udGgtcG9wdXAtYnV0dG9uIC5kaXNjbG9zdXJlLXRyaWFuZ2xlIHN2ZyB7Ci0gICAg
cGFkZGluZy1ib3R0b206IDJweDsKLX0KLQotLnRvZGF5LWJ1dHRvbjo6YWZ0ZXIgewotICAgIGNv
bnRlbnQ6ICIiOwotICAgIGRpc3BsYXk6IGJsb2NrOwotICAgIGJvcmRlci1yYWRpdXM6IDNweDsK
LSAgICB3aWR0aDogNnB4OwotICAgIGhlaWdodDogNnB4OwotICAgIGJhY2tncm91bmQtY29sb3I6
ICM2ZTZlNmU7Ci0gICAgbWFyZ2luOiAwIGF1dG87Ci19Ci0KLS5jYWxlbmRhci1uYXZpZ2F0aW9u
LWJ1dHRvbiB7Ci0gICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7Ci0gICAgd2lkdGg6IDI0
cHg7Ci0gICAgaGVpZ2h0OiAyNHB4OwotICAgIG1pbi13aWR0aDogMCAhaW1wb3J0YW50OwotICAg
IHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50OwotICAgIHBhZGRpbmctcmlnaHQ6IDAgIWltcG9y
dGFudDsKLSAgICAtd2Via2l0LW1hcmdpbi1zdGFydDogNHB4ICFpbXBvcnRhbnQ7Ci19Ci0KLS55
ZWFyLWxpc3QtdmlldyB7Ci0gICAgYm9yZGVyOiAxcHggc29saWQgI2JmYmZiZjsKLSAgICBiYWNr
Z3JvdW5kLWNvbG9yOiB3aGl0ZTsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci19Ci0KLS55ZWFy
LWxpc3QtY2VsbCB7Ci0gICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKLSAgICBib3JkZXItYm90
dG9tOiAxcHggc29saWQgI2JmYmZiZjsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLSAg
ICBvdmVyZmxvdzogaGlkZGVuOwotfQotCi0ueWVhci1saXN0LWNlbGwgLmxhYmVsIHsKLSAgICBo
ZWlnaHQ6IDI0cHg7Ci0gICAgbGluZS1oZWlnaHQ6IDI0cHg7Ci0gICAgLXdlYmtpdC1wYWRkaW5n
LXN0YXJ0OiA4cHg7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKLSAgICBib3JkZXIt
Ym90dG9tOiAxcHggc29saWQgI2JmYmZiZjsKLX0KLQotLnllYXItbGlzdC1jZWxsIC5tb250aC1j
aG9vc2VyIHsKLSAgICBwYWRkaW5nOiAwOwotfQotCi0ubW9udGgtYnV0dG9ucy1yb3cgewotICAg
IGRpc3BsYXk6IC13ZWJraXQtZmxleDsKLX0KLQotLm1vbnRoLWJ1dHRvbiB7Ci0gICAgLXdlYmtp
dC1mbGV4OiAxOwotICAgIGhlaWdodDogMzJweDsKLSAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7
Ci0gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZSAh
aW1wb3J0YW50OwotICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gICAgYm9yZGVyLXdp
ZHRoOiAwICFpbXBvcnRhbnQ7Ci0gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwotfQot
Ci0ubW9udGgtYnV0dG9uLmhpZ2hsaWdodGVkIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVl
Y2Y4OwotfQotCi0uc2NydWJieS1zY3JvbGwtYmFyIHsKLSAgICB3aWR0aDogMTRweDsKLSAgICBo
ZWlnaHQ6IDYwcHg7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ci0gICAgYm9yZGVyLWxl
ZnQ6IDFweCBzb2xpZCAjYmZiZmJmOwotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICB0b3A6
IDA7Ci19Ci0KLS5zY3J1YmJ5LXNjcm9sbC10aHVtYiB7Ci0gICAgd2lkdGg6IDEwcHg7Ci0gICAg
bWFyZ2luOiAycHg7Ci0gICAgaGVpZ2h0OiAzMHB4OwotICAgIGJhY2tncm91bmQtY29sb3I6ICNk
OGQ4ZDg7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIGxlZnQ6IDA7Ci0gICAgdG9wOiAw
OwotfQotCi0ubW9udGgtcG9wdXAtdmlldyB7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAg
IHRvcDogMDsKLSAgICByaWdodDogMDsKLSAgICBib3R0b206IDA7Ci0gICAgbGVmdDogMDsKLX0K
LQotLnllYXItbGlzdC12aWV3IC5zY3J1YmJ5LXNjcm9sbC1iYXIgewotICAgIHJpZ2h0OiAwOwot
fQotCi0ucnRsIC55ZWFyLWxpc3QtdmlldyAuc2NydWJieS1zY3JvbGwtYmFyIHsKLSAgICBsZWZ0
OiAwOwotICAgIHJpZ2h0OiBhdXRvOwotICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwOwotICAgIGJv
cmRlci1yaWdodDogMXB4IHNvbGlkICNiZmJmYmY7Ci19CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9SZXNvdXJjZXMvcGFnZXBvcHVwcy9jYWxlbmRhclBpY2tlci5qcyBiL1NvdXJjZS9XZWJD
b3JlL1Jlc291cmNlcy9wYWdlcG9wdXBzL2NhbGVuZGFyUGlja2VyLmpzCmRlbGV0ZWQgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCA4OGM5NGE0MGQyMTI3NjQ4NTk2MDcxZTgwMGRlY2ViMjE4YWNhYWU2
Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9X
ZWJDb3JlL1Jlc291cmNlcy9wYWdlcG9wdXBzL2NhbGVuZGFyUGlja2VyLmpzCisrKyAvZGV2L251
bGwKQEAgLTEsNDAwNiArMCwwIEBACi0idXNlIHN0cmljdCI7Ci0vKgotICogQ29weXJpZ2h0IChD
KSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAq
ICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBp
dHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0g
KiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotCi0vKioKLSAqIEBlbnVtIHtudW1i
ZXJ9Ci0gKi8KLXZhciBXZWVrRGF5ID0gewotICAgIFN1bmRheTogMCwKLSAgICBNb25kYXk6IDEs
Ci0gICAgVHVlc2RheTogMiwKLSAgICBXZWRuZXNkYXk6IDMsCi0gICAgVGh1cnNkYXk6IDQsCi0g
ICAgRnJpZGF5OiA1LAotICAgIFNhdHVyZGF5OiA2Ci19OwotCi0vKioKLSAqIEB0eXBlIHtPYmpl
Y3R9Ci0gKi8KLXZhciBnbG9iYWwgPSB7Ci0gICAgcGlja2VyOiBudWxsLAotICAgIHBhcmFtczog
ewotICAgICAgICBsb2NhbGU6ICJlbl9VUyIsCi0gICAgICAgIHdlZWtTdGFydERheTogV2Vla0Rh
eS5TdW5kYXksCi0gICAgICAgIGRheUxhYmVsczogWyJTIiwgIk0iLCAiVCIsICJXIiwgIlQiLCAi
RiIsICJTIl0sCi0gICAgICAgIHNob3J0TW9udGhMYWJlbHM6IFsiSmFuIiwgIkZlYiIsICJNYXIi
LCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXB0IiwgIk9jdCIsICJOb3Yi
LCAiRGVjIl0sCi0gICAgICAgIGlzTG9jYWxlUlRMOiBmYWxzZSwKLSAgICAgICAgbW9kZTogImRh
dGUiLAotICAgICAgICB3ZWVrTGFiZWw6ICJXZWVrIiwKLSAgICAgICAgYW5jaG9yUmVjdEluU2Ny
ZWVuOiBuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLAotICAgICAgICBjdXJyZW50VmFsdWU6IG51
bGwKLSAgICB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBVdGlsaXR5IGZ1bmN0aW9ucwotCi0vKioK
LSAqIEByZXR1cm4geyFib29sfQotICovCi1mdW5jdGlvbiBoYXNJbmFjY3VyYXRlUG9pbnRpbmdE
ZXZpY2UoKSB7Ci0gICAgcmV0dXJuIG1hdGNoTWVkaWEoIihwb2ludGVyOiBjb2Fyc2UpIikubWF0
Y2hlczsKLX0KLQotLyoqCi0gKiBAcmV0dXJuIHshc3RyaW5nfSBsb3dlcmNhc2UgbG9jYWxlIG5h
bWUuIGUuZy4gImVuLXVzIgotICovCi1mdW5jdGlvbiBnZXRMb2NhbGUoKSB7Ci0gICAgcmV0dXJu
IChnbG9iYWwucGFyYW1zLmxvY2FsZSB8fCAiZW4tdXMiKS50b0xvd2VyQ2FzZSgpOwotfQotCi0v
KioKLSAqIEByZXR1cm4geyFzdHJpbmd9IGxvd2VyY2FzZSBsYW5ndWFnZSBjb2RlLiBlLmcuICJl
biIKLSAqLwotZnVuY3Rpb24gZ2V0TGFuZ3VhZ2UoKSB7Ci0gICAgdmFyIGxvY2FsZSA9IGdldExv
Y2FsZSgpOwotICAgIHZhciByZXN1bHQgPSBsb2NhbGUubWF0Y2goL14oW2Etel0rKS8pOwotICAg
IGlmICghcmVzdWx0KQotICAgICAgICByZXR1cm4gImVuIjsKLSAgICByZXR1cm4gcmVzdWx0WzFd
OwotfQotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gbnVtYmVyCi0gKiBAcmV0dXJuIHshc3Ry
aW5nfQotICovCi1mdW5jdGlvbiBsb2NhbGl6ZU51bWJlcihudW1iZXIpIHsKLSAgICByZXR1cm4g
d2luZG93LnBhZ2VQb3B1cENvbnRyb2xsZXIubG9jYWxpemVOdW1iZXJTdHJpbmcobnVtYmVyKTsK
LX0KLQotLyoqCi0gKiBAY29uc3QKLSAqIEB0eXBlIHtudW1iZXJ9Ci0gKi8KLXZhciBJbXBlcmlh
bEVyYUxpbWl0ID0gMjA4NzsKLQotLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IHllYXIKLSAqIEBw
YXJhbSB7IW51bWJlcn0gbW9udGgKLSAqIEByZXR1cm4geyFzdHJpbmd9Ci0gKi8KLWZ1bmN0aW9u
IGZvcm1hdEphcGFuZXNlSW1wZXJpYWxFcmEoeWVhciwgbW9udGgpIHsKLSAgICAvLyBXZSBkb24n
dCBzaG93IGFuIGltcGVyaWFsIGVyYSBpZiBpdCBpcyBncmVhdGVyIHRoYW4gOTkgYmVjYXNlIG9m
IHNwYWNlCi0gICAgLy8gbGltaXRhdGlvbi4KLSAgICBpZiAoeWVhciA+IEltcGVyaWFsRXJhTGlt
aXQpCi0gICAgICAgIHJldHVybiAiIjsKLSAgICBpZiAoeWVhciA+IDE5ODkpCi0gICAgICAgIHJl
dHVybiAiKOW5s+aIkCIgKyBsb2NhbGl6ZU51bWJlcih5ZWFyIC0gMTk4OCkgKyAi5bm0KSI7Ci0g
ICAgaWYgKHllYXIgPT0gMTk4OSkKLSAgICAgICAgcmV0dXJuICIo5bmz5oiQ5YWD5bm0KSI7Ci0g
ICAgaWYgKHllYXIgPj0gMTkyNykKLSAgICAgICAgcmV0dXJuICIo5pit5ZKMIiArIGxvY2FsaXpl
TnVtYmVyKHllYXIgLSAxOTI1KSArICLlubQpIjsKLSAgICBpZiAoeWVhciA+IDE5MTIpCi0gICAg
ICAgIHJldHVybiAiKOWkp+atoyIgKyBsb2NhbGl6ZU51bWJlcih5ZWFyIC0gMTkxMSkgKyAi5bm0
KSI7Ci0gICAgaWYgKHllYXIgPT0gMTkxMiAmJiBtb250aCA+PSA3KQotICAgICAgICByZXR1cm4g
IijlpKfmraPlhYPlubQpIjsKLSAgICBpZiAoeWVhciA+IDE4NjgpCi0gICAgICAgIHJldHVybiAi
KOaYjuayuyIgKyBsb2NhbGl6ZU51bWJlcih5ZWFyIC0gMTg2NykgKyAi5bm0KSI7Ci0gICAgaWYg
KHllYXIgPT0gMTg2OCkKLSAgICAgICAgcmV0dXJuICIo5piO5rK75YWD5bm0KSI7Ci0gICAgcmV0
dXJuICIiOwotfQotCi1mdW5jdGlvbiBjcmVhdGVVVENEYXRlKHllYXIsIG1vbnRoLCBkYXRlKSB7
Ci0gICAgdmFyIG5ld0RhdGUgPSBuZXcgRGF0ZSgwKTsKLSAgICBuZXdEYXRlLnNldFVUQ0Z1bGxZ
ZWFyKHllYXIpOwotICAgIG5ld0RhdGUuc2V0VVRDTW9udGgobW9udGgpOwotICAgIG5ld0RhdGUu
c2V0VVRDRGF0ZShkYXRlKTsKLSAgICByZXR1cm4gbmV3RGF0ZTsKLX0KLQotLyoqCi0gKiBAcGFy
YW0ge3N0cmluZ30gZGF0ZVN0cmluZwotICogQHJldHVybiB7P0RheXxXZWVrfE1vbnRofQotICov
Ci1mdW5jdGlvbiBwYXJzZURhdGVTdHJpbmcoZGF0ZVN0cmluZykgewotICAgIHZhciBtb250aCA9
IE1vbnRoLnBhcnNlKGRhdGVTdHJpbmcpOwotICAgIGlmIChtb250aCkKLSAgICAgICAgcmV0dXJu
IG1vbnRoOwotICAgIHZhciB3ZWVrID0gV2Vlay5wYXJzZShkYXRlU3RyaW5nKTsKLSAgICBpZiAo
d2VlaykKLSAgICAgICAgcmV0dXJuIHdlZWs7Ci0gICAgcmV0dXJuIERheS5wYXJzZShkYXRlU3Ry
aW5nKTsKLX0KLQotLyoqCi0gKiBAY29uc3QKLSAqIEB0eXBlIHtudW1iZXJ9Ci0gKi8KLXZhciBE
YXlzUGVyV2VlayA9IDc7Ci0KLS8qKgotICogQGNvbnN0Ci0gKiBAdHlwZSB7bnVtYmVyfQotICov
Ci12YXIgTW9udGhzUGVyWWVhciA9IDEyOwotCi0vKioKLSAqIEBjb25zdAotICogQHR5cGUge251
bWJlcn0KLSAqLwotdmFyIE1pbGxpc2Vjb25kc1BlckRheSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7
Ci0KLS8qKgotICogQGNvbnN0Ci0gKiBAdHlwZSB7bnVtYmVyfQotICovCi12YXIgTWlsbGlzZWNv
bmRzUGVyV2VlayA9IERheXNQZXJXZWVrICogTWlsbGlzZWNvbmRzUGVyRGF5OwotCi0vKioKLSAq
IEBjb25zdHJ1Y3RvcgotICovCi1mdW5jdGlvbiBEYXRlVHlwZSgpIHsKLX0KLQotLyoqCi0gKiBA
Y29uc3RydWN0b3IKLSAqIEBleHRlbmRzIERhdGVUeXBlCi0gKiBAcGFyYW0geyFudW1iZXJ9IHll
YXIKLSAqIEBwYXJhbSB7IW51bWJlcn0gbW9udGgKLSAqIEBwYXJhbSB7IW51bWJlcn0gZGF0ZQot
ICovCi1mdW5jdGlvbiBEYXkoeWVhciwgbW9udGgsIGRhdGUpIHsKLSAgICB2YXIgZGF0ZU9iamVj
dCA9IGNyZWF0ZVVUQ0RhdGUoeWVhciwgbW9udGgsIGRhdGUpOwotICAgIGlmIChpc05hTihkYXRl
T2JqZWN0LnZhbHVlT2YoKSkpCi0gICAgICAgIHRocm93ICJJbnZhbGlkIGRhdGUiOwotICAgIC8q
KgotICAgICAqIEB0eXBlIHtudW1iZXJ9Ci0gICAgICogQGNvbnN0Ci0gICAgICovCi0gICAgdGhp
cy55ZWFyID0gZGF0ZU9iamVjdC5nZXRVVENGdWxsWWVhcigpOyAgIAotICAgICAvKioKLSAgICAg
KiBAdHlwZSB7bnVtYmVyfQotICAgICAqIEBjb25zdAotICAgICAqLyAgCi0gICAgdGhpcy5tb250
aCA9IGRhdGVPYmplY3QuZ2V0VVRDTW9udGgoKTsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7bnVt
YmVyfQotICAgICAqIEBjb25zdAotICAgICAqLwotICAgIHRoaXMuZGF0ZSA9IGRhdGVPYmplY3Qu
Z2V0VVRDRGF0ZSgpOwotfTsKLQotRGF5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRGF0ZVR5
cGUucHJvdG90eXBlKTsKLQotRGF5LklTT1N0cmluZ1JlZ0V4cCA9IC9eKFxkKyktKFxkKyktKFxk
KykvOwotCi0vKioKLSAqIEBwYXJhbSB7IXN0cmluZ30gc3RyCi0gKiBAcmV0dXJuIHs/RGF5fQot
ICovCi1EYXkucGFyc2UgPSBmdW5jdGlvbihzdHIpIHsKLSAgICB2YXIgbWF0Y2ggPSBEYXkuSVNP
U3RyaW5nUmVnRXhwLmV4ZWMoc3RyKTsKLSAgICBpZiAoIW1hdGNoKQotICAgICAgICByZXR1cm4g
bnVsbDsKLSAgICB2YXIgeWVhciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7Ci0gICAgdmFyIG1v
bnRoID0gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKSAtIDE7Ci0gICAgdmFyIGRhdGUgPSBwYXJzZUlu
dChtYXRjaFszXSwgMTApOwotICAgIHJldHVybiBuZXcgRGF5KHllYXIsIG1vbnRoLCBkYXRlKTsK
LX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSB2YWx1ZQotICogQHJldHVybiB7IURheX0K
LSAqLwotRGF5LmNyZWF0ZUZyb21WYWx1ZSA9IGZ1bmN0aW9uKG1pbGxpc2Vjb25kc1NpbmNlRXBv
Y2gpIHsKLSAgICByZXR1cm4gRGF5LmNyZWF0ZUZyb21EYXRlKG5ldyBEYXRlKG1pbGxpc2Vjb25k
c1NpbmNlRXBvY2gpKQotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFEYXRlfSBkYXRlCi0gKiBAcmV0
dXJuIHshRGF5fQotICovCi1EYXkuY3JlYXRlRnJvbURhdGUgPSBmdW5jdGlvbihkYXRlKSB7Ci0g
ICAgaWYgKGlzTmFOKGRhdGUudmFsdWVPZigpKSkKLSAgICAgICAgdGhyb3cgIkludmFsaWQgZGF0
ZSI7Ci0gICAgcmV0dXJuIG5ldyBEYXkoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCBkYXRlLmdldFVU
Q01vbnRoKCksIGRhdGUuZ2V0VVRDRGF0ZSgpKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshRGF5
fSBkYXkKLSAqIEByZXR1cm4geyFEYXl9Ci0gKi8KLURheS5jcmVhdGVGcm9tRGF5ID0gZnVuY3Rp
b24oZGF5KSB7Ci0gICAgcmV0dXJuIGRheTsKLX07Ci0KLS8qKgotICogQHJldHVybiB7IURheX0K
LSAqLwotRGF5LmNyZWF0ZUZyb21Ub2RheSA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBub3cgPSBu
ZXcgRGF0ZSgpOwotICAgIHJldHVybiBuZXcgRGF5KG5vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0
TW9udGgoKSwgbm93LmdldERhdGUoKSk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IURhdGVUeXBl
fSBvdGhlcgotICogQHJldHVybiB7IWJvb2xlYW59Ci0gKi8KLURheS5wcm90b3R5cGUuZXF1YWxz
ID0gZnVuY3Rpb24ob3RoZXIpIHsKLSAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBEYXkgJiYg
dGhpcy55ZWFyID09PSBvdGhlci55ZWFyICYmIHRoaXMubW9udGggPT09IG90aGVyLm1vbnRoICYm
IHRoaXMuZGF0ZSA9PT0gb3RoZXIuZGF0ZTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVy
PX0gb2Zmc2V0Ci0gKiBAcmV0dXJuIHshRGF5fQotICovCi1EYXkucHJvdG90eXBlLnByZXZpb3Vz
ID0gZnVuY3Rpb24ob2Zmc2V0KSB7Ci0gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICJ1bmRlZmlu
ZWQiKQotICAgICAgICBvZmZzZXQgPSAxOwotICAgIHJldHVybiBuZXcgRGF5KHRoaXMueWVhciwg
dGhpcy5tb250aCwgdGhpcy5kYXRlIC0gb2Zmc2V0KTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHsh
bnVtYmVyPX0gb2Zmc2V0Ci0gKiBAcmV0dXJuIHshRGF5fQotICovCi1EYXkucHJvdG90eXBlLm5l
eHQgPSBmdW5jdGlvbihvZmZzZXQpIHsKLSBpZiAodHlwZW9mIG9mZnNldCA9PT0gInVuZGVmaW5l
ZCIpCi0gICAgIG9mZnNldCA9IDE7Ci0gICAgcmV0dXJuIG5ldyBEYXkodGhpcy55ZWFyLCB0aGlz
Lm1vbnRoLCB0aGlzLmRhdGUgKyBvZmZzZXQpOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshRGF0
ZX0KLSAqLwotRGF5LnByb3RvdHlwZS5zdGFydERhdGUgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1
cm4gY3JlYXRlVVRDRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSk7Ci19Owot
Ci0vKioKLSAqIEByZXR1cm4geyFEYXRlfQotICovCi1EYXkucHJvdG90eXBlLmVuZERhdGUgPSBm
dW5jdGlvbigpIHsKLSAgICByZXR1cm4gY3JlYXRlVVRDRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9u
dGgsIHRoaXMuZGF0ZSArIDEpOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshRGF5fQotICovCi1E
YXkucHJvdG90eXBlLmZpcnN0RGF5ID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXM7Ci19
OwotCi0vKioKLSAqIEByZXR1cm4geyFEYXl9Ci0gKi8KLURheS5wcm90b3R5cGUubWlkZGxlRGF5
ID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXM7Ci19OwotCi0vKioKLSAqIEByZXR1cm4g
eyFEYXl9Ci0gKi8KLURheS5wcm90b3R5cGUubGFzdERheSA9IGZ1bmN0aW9uKCkgewotICAgIHJl
dHVybiB0aGlzOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshbnVtYmVyfQotICovCi1EYXkucHJv
dG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gY3JlYXRlVVRDRGF0ZSh0
aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSkuZ2V0VGltZSgpOwotfTsKLQotLyoqCi0g
KiBAcmV0dXJuIHshV2Vla0RheX0KLSAqLwotRGF5LnByb3RvdHlwZS53ZWVrRGF5ID0gZnVuY3Rp
b24oKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZVVUQ0RhdGUodGhpcy55ZWFyLCB0aGlzLm1vbnRoLCB0
aGlzLmRhdGUpLmdldFVUQ0RheSgpOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshc3RyaW5nfQot
ICovCi1EYXkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHllYXJT
dHJpbmcgPSBTdHJpbmcodGhpcy55ZWFyKTsKLSAgICBpZiAoeWVhclN0cmluZy5sZW5ndGggPCA0
KQotICAgICAgICB5ZWFyU3RyaW5nID0gKCIwMDAiICsgeWVhclN0cmluZykuc3Vic3RyKC00LCA0
KTsKLSAgICByZXR1cm4geWVhclN0cmluZyArICItIiArICgiMCIgKyAodGhpcy5tb250aCArIDEp
KS5zdWJzdHIoLTIsIDIpICsgIi0iICsgKCIwIiArIHRoaXMuZGF0ZSkuc3Vic3RyKC0yLCAyKTsK
LX07Ci0KLS8vIFNlZSBXZWJDb3JlL3BsYXRmb3JtL0RhdGVDb21wb25lbnRzLmguCi1EYXkuTWlu
aW11bSA9IERheS5jcmVhdGVGcm9tVmFsdWUoLTYyMTM1NTk2ODAwMDAwLjApOwotRGF5Lk1heGlt
dW0gPSBEYXkuY3JlYXRlRnJvbVZhbHVlKDg2NDAwMDAwMDAwMDAwMDAuMCk7Ci0KLS8vIFNlZSBX
ZWJDb3JlL2h0bWwvRGF5SW5wdXRUeXBlLmNwcC4KLURheS5EZWZhdWx0U3RlcCA9IDg2NDAwMDAw
OwotRGF5LkRlZmF1bHRTdGVwQmFzZSA9IDA7Ci0KLS8qKgotICogQGNvbnN0cnVjdG9yCi0gKiBA
ZXh0ZW5kcyBEYXRlVHlwZQotICogQHBhcmFtIHshbnVtYmVyfSB5ZWFyCi0gKiBAcGFyYW0geyFu
dW1iZXJ9IHdlZWsKLSAqLwotZnVuY3Rpb24gV2Vlayh5ZWFyLCB3ZWVrKSB7IAotICAgIC8qKgot
ICAgICAqIEB0eXBlIHtudW1iZXJ9Ci0gICAgICogQGNvbnN0Ci0gICAgICovCi0gICAgdGhpcy55
ZWFyID0geWVhcjsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7bnVtYmVyfQotICAgICAqIEBjb25z
dAotICAgICAqLwotICAgIHRoaXMud2VlayA9IHdlZWs7Ci0gICAgLy8gTnVtYmVyIG9mIHllYXJz
IHBlciB5ZWFyIGlzIGVpdGhlciA1MiBvciA1My4KLSAgICBpZiAodGhpcy53ZWVrIDwgMSB8fCAo
dGhpcy53ZWVrID4gNTIgJiYgdGhpcy53ZWVrID4gV2Vlay5udW1iZXJPZldlZWtzSW5ZZWFyKHRo
aXMueWVhcikpKSB7Ci0gICAgICAgIHZhciBub3JtYWxpemVkV2VlayA9IFdlZWsuY3JlYXRlRnJv
bURheSh0aGlzLmZpcnN0RGF5KCkpOwotICAgICAgICB0aGlzLnllYXIgPSBub3JtYWxpemVkV2Vl
ay55ZWFyOwotICAgICAgICB0aGlzLndlZWsgPSBub3JtYWxpemVkV2Vlay53ZWVrOwotICAgIH0K
LX0KLQotV2Vlay5JU09TdHJpbmdSZWdFeHAgPSAvXihcZCspLVt3V10oXGQrKSQvOwotCi0vLyBT
ZWUgV2ViQ29yZS9wbGF0Zm9ybS9EYXRlQ29tcG9uZW50cy5oLgotV2Vlay5NaW5pbXVtID0gbmV3
IFdlZWsoMSwgMSk7Ci1XZWVrLk1heGltdW0gPSBuZXcgV2VlaygyNzU3NjAsIDM3KTsKLQotLy8g
U2VlIFdlYkNvcmUvaHRtbC9XZWVrSW5wdXRUeXBlLmNwcC4KLVdlZWsuRGVmYXVsdFN0ZXAgPSA2
MDQ4MDAwMDA7Ci1XZWVrLkRlZmF1bHRTdGVwQmFzZSA9IC0yNTkyMDAwMDA7Ci0KLVdlZWsuRXBv
Y2hXZWVrRGF5ID0gY3JlYXRlVVRDRGF0ZSgxOTcwLCAwLCAwKS5nZXRVVENEYXkoKTsKLQotLyoq
Ci0gKiBAcGFyYW0geyFzdHJpbmd9IHN0cgotICogQHJldHVybiB7P1dlZWt9Ci0gKi8KLVdlZWsu
cGFyc2UgPSBmdW5jdGlvbihzdHIpIHsKLSAgICB2YXIgbWF0Y2ggPSBXZWVrLklTT1N0cmluZ1Jl
Z0V4cC5leGVjKHN0cik7Ci0gICAgaWYgKCFtYXRjaCkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0g
ICAgdmFyIHllYXIgPSBwYXJzZUludChtYXRjaFsxXSwgMTApOwotICAgIHZhciB3ZWVrID0gcGFy
c2VJbnQobWF0Y2hbMl0sIDEwKTsKLSAgICByZXR1cm4gbmV3IFdlZWsoeWVhciwgd2Vlayk7Ci19
OwotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gbWlsbGlzZWNvbmRzU2luY2VFcG9jaAotICog
QHJldHVybiB7IVdlZWt9Ci0gKi8KLVdlZWsuY3JlYXRlRnJvbVZhbHVlID0gZnVuY3Rpb24obWls
bGlzZWNvbmRzU2luY2VFcG9jaCkgewotICAgIHJldHVybiBXZWVrLmNyZWF0ZUZyb21EYXRlKG5l
dyBEYXRlKG1pbGxpc2Vjb25kc1NpbmNlRXBvY2gpKQotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFE
YXRlfSBkYXRlCi0gKiBAcmV0dXJuIHshV2Vla30KLSAqLwotV2Vlay5jcmVhdGVGcm9tRGF0ZSA9
IGZ1bmN0aW9uKGRhdGUpIHsKLSAgICBpZiAoaXNOYU4oZGF0ZS52YWx1ZU9mKCkpKQotICAgICAg
ICB0aHJvdyAiSW52YWxpZCBkYXRlIjsKLSAgICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFll
YXIoKTsKLSAgICBpZiAoeWVhciA8PSBXZWVrLk1heGltdW0ueWVhciAmJiBXZWVrLndlZWtPbmVT
dGFydERhdGVGb3JZZWFyKHllYXIgKyAxKS5nZXRUaW1lKCkgPD0gZGF0ZS5nZXRUaW1lKCkpCi0g
ICAgICAgIHllYXIrKzsKLSAgICBlbHNlIGlmICh5ZWFyID4gMSAmJiBXZWVrLndlZWtPbmVTdGFy
dERhdGVGb3JZZWFyKHllYXIpLmdldFRpbWUoKSA+IGRhdGUuZ2V0VGltZSgpKQotICAgICAgICB5
ZWFyLS07Ci0gICAgdmFyIHdlZWsgPSAxICsgV2Vlay5fbnVtYmVyT2ZXZWVrc1NpbmNlRGF0ZShX
ZWVrLndlZWtPbmVTdGFydERhdGVGb3JZZWFyKHllYXIpLCBkYXRlKTsKLSAgICByZXR1cm4gbmV3
IFdlZWsoeWVhciwgd2Vlayk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IURheX0gZGF5Ci0gKiBA
cmV0dXJuIHshV2Vla30KLSAqLwotV2Vlay5jcmVhdGVGcm9tRGF5ID0gZnVuY3Rpb24oZGF5KSB7
Ci0gICAgdmFyIHllYXIgPSBkYXkueWVhcjsKLSAgICBpZiAoeWVhciA8PSBXZWVrLk1heGltdW0u
eWVhciAmJiBXZWVrLndlZWtPbmVTdGFydERheUZvclllYXIoeWVhciArIDEpIDw9IGRheSkKLSAg
ICAgICAgeWVhcisrOwotICAgIGVsc2UgaWYgKHllYXIgPiAxICYmIFdlZWsud2Vla09uZVN0YXJ0
RGF5Rm9yWWVhcih5ZWFyKSA+IGRheSkKLSAgICAgICAgeWVhci0tOwotICAgIHZhciB3ZWVrID0g
TWF0aC5mbG9vcigxICsgKGRheS52YWx1ZU9mKCkgLSBXZWVrLndlZWtPbmVTdGFydERheUZvclll
YXIoeWVhcikudmFsdWVPZigpKSAvIE1pbGxpc2Vjb25kc1BlcldlZWspOwotICAgIHJldHVybiBu
ZXcgV2Vlayh5ZWFyLCB3ZWVrKTsKLX07Ci0KLS8qKgotICogQHJldHVybiB7IVdlZWt9Ci0gKi8K
LVdlZWsuY3JlYXRlRnJvbVRvZGF5ID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5vdyA9IG5ldyBE
YXRlKCk7Ci0gICAgcmV0dXJuIFdlZWsuY3JlYXRlRnJvbURhdGUoY3JlYXRlVVRDRGF0ZShub3cu
Z2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIG5vdy5nZXREYXRlKCkpKTsKLX07Ci0KLS8q
KgotICogQHBhcmFtIHshbnVtYmVyfSB5ZWFyCi0gKiBAcmV0dXJuIHshRGF0ZX0KLSAqLwotV2Vl
ay53ZWVrT25lU3RhcnREYXRlRm9yWWVhciA9IGZ1bmN0aW9uKHllYXIpIHsKLSAgICBpZiAoeWVh
ciA8IDEpCi0gICAgICAgIHJldHVybiBjcmVhdGVVVENEYXRlKDEsIDAsIDEpOwotICAgIC8vIFRo
ZSB3ZWVrIGNvbnRhaW5pbmcgSmFudWFyeSA0dGggaXMgd2VlayBvbmUuCi0gICAgdmFyIHllYXJT
dGFydERheSA9IGNyZWF0ZVVUQ0RhdGUoeWVhciwgMCwgNCkuZ2V0VVRDRGF5KCk7Ci0gICAgcmV0
dXJuIGNyZWF0ZVVUQ0RhdGUoeWVhciwgMCwgNCAtICh5ZWFyU3RhcnREYXkgKyA2KSAlIERheXNQ
ZXJXZWVrKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSB5ZWFyCi0gKiBAcmV0dXJu
IHshRGF5fQotICovCi1XZWVrLndlZWtPbmVTdGFydERheUZvclllYXIgPSBmdW5jdGlvbih5ZWFy
KSB7Ci0gICAgaWYgKHllYXIgPCAxKQotICAgICAgICByZXR1cm4gRGF5Lk1pbmltdW07Ci0gICAg
Ly8gVGhlIHdlZWsgY29udGFpbmluZyBKYW51YXJ5IDR0aCBpcyB3ZWVrIG9uZS4KLSAgICB2YXIg
eWVhclN0YXJ0RGF5ID0gY3JlYXRlVVRDRGF0ZSh5ZWFyLCAwLCA0KS5nZXRVVENEYXkoKTsKLSAg
ICByZXR1cm4gbmV3IERheSh5ZWFyLCAwLCA0IC0gKHllYXJTdGFydERheSArIDYpICUgRGF5c1Bl
cldlZWspOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IHllYXIKLSAqIEByZXR1cm4g
eyFudW1iZXJ9Ci0gKi8KLVdlZWsubnVtYmVyT2ZXZWVrc0luWWVhciA9IGZ1bmN0aW9uKHllYXIp
IHsKLSAgICBpZiAoeWVhciA8IDEgfHwgeWVhciA+IFdlZWsuTWF4aW11bS55ZWFyKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICBlbHNlIGlmICh5ZWFyID09PSBXZWVrLk1heGltdW0ueWVhcikKLSAg
ICAgICAgcmV0dXJuIFdlZWsuTWF4aW11bS53ZWVrOwotICAgIHJldHVybiBXZWVrLl9udW1iZXJP
ZldlZWtzU2luY2VEYXRlKFdlZWsud2Vla09uZVN0YXJ0RGF0ZUZvclllYXIoeWVhciksIFdlZWsu
d2Vla09uZVN0YXJ0RGF0ZUZvclllYXIoeWVhciArIDEpKTsKLX07Ci0KLS8qKgotICogQHBhcmFt
IHshRGF0ZX0gYmFzZURhdGUKLSAqIEBwYXJhbSB7IURhdGV9IGRhdGUKLSAqIEByZXR1cm4geyFu
dW1iZXJ9Ci0gKi8KLVdlZWsuX251bWJlck9mV2Vla3NTaW5jZURhdGUgPSBmdW5jdGlvbihiYXNl
RGF0ZSwgZGF0ZSkgewotICAgIHJldHVybiBNYXRoLmZsb29yKChkYXRlLmdldFRpbWUoKSAtIGJh
c2VEYXRlLmdldFRpbWUoKSkgLyBNaWxsaXNlY29uZHNQZXJXZWVrKTsKLX07Ci0KLS8qKgotICog
QHBhcmFtIHshRGF0ZVR5cGV9IG90aGVyCi0gKiBAcmV0dXJuIHshYm9vbGVhbn0KLSAqLwotV2Vl
ay5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHsKLSAgICByZXR1cm4gb3RoZXIg
aW5zdGFuY2VvZiBXZWVrICYmIHRoaXMueWVhciA9PT0gb3RoZXIueWVhciAmJiB0aGlzLndlZWsg
PT09IG90aGVyLndlZWs7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcj19IG9mZnNldAot
ICogQHJldHVybiB7IVdlZWt9Ci0gKi8KLVdlZWsucHJvdG90eXBlLnByZXZpb3VzID0gZnVuY3Rp
b24ob2Zmc2V0KSB7Ci0gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICJ1bmRlZmluZWQiKQotICAg
ICAgICBvZmZzZXQgPSAxOwotICAgIHJldHVybiBuZXcgV2Vlayh0aGlzLnllYXIsIHRoaXMud2Vl
ayAtIG9mZnNldCk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcj19IG9mZnNldAotICog
QHJldHVybiB7IVdlZWt9Ci0gKi8KLVdlZWsucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbihvZmZz
ZXQpIHsKLSAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gInVuZGVmaW5lZCIpCi0gICAgICAgIG9m
ZnNldCA9IDE7Ci0gICAgcmV0dXJuIG5ldyBXZWVrKHRoaXMueWVhciwgdGhpcy53ZWVrICsgb2Zm
c2V0KTsKLX07Ci0KLS8qKgotICogQHJldHVybiB7IURhdGV9Ci0gKi8KLVdlZWsucHJvdG90eXBl
LnN0YXJ0RGF0ZSA9IGZ1bmN0aW9uKCkgewotICAgIHZhciB3ZWVrU3RhcnREYXRlID0gV2Vlay53
ZWVrT25lU3RhcnREYXRlRm9yWWVhcih0aGlzLnllYXIpOwotICAgIHdlZWtTdGFydERhdGUuc2V0
VVRDRGF0ZSh3ZWVrU3RhcnREYXRlLmdldFVUQ0RhdGUoKSArICh0aGlzLndlZWsgLSAxKSAqIDcp
OwotICAgIHJldHVybiB3ZWVrU3RhcnREYXRlOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshRGF0
ZX0KLSAqLwotV2Vlay5wcm90b3R5cGUuZW5kRGF0ZSA9IGZ1bmN0aW9uKCkgewotICAgIGlmICh0
aGlzLmVxdWFscyhXZWVrLk1heGltdW0pKQotICAgICAgICByZXR1cm4gRGF5Lk1heGltdW0uc3Rh
cnREYXRlKCk7Ci0gICAgcmV0dXJuIHRoaXMubmV4dCgpLnN0YXJ0RGF0ZSgpOwotfTsKLQotLyoq
Ci0gKiBAcmV0dXJuIHshRGF5fQotICovCi1XZWVrLnByb3RvdHlwZS5maXJzdERheSA9IGZ1bmN0
aW9uKCkgewotICAgIHZhciB3ZWVrT25lU3RhcnREYXkgPSBXZWVrLndlZWtPbmVTdGFydERheUZv
clllYXIodGhpcy55ZWFyKTsKLSAgICByZXR1cm4gd2Vla09uZVN0YXJ0RGF5Lm5leHQoKHRoaXMu
d2VlayAtIDEpICogRGF5c1BlcldlZWspOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshRGF5fQot
ICovCi1XZWVrLnByb3RvdHlwZS5taWRkbGVEYXkgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4g
dGhpcy5maXJzdERheSgpLm5leHQoMyk7Ci19OwotCi0vKioKLSAqIEByZXR1cm4geyFEYXl9Ci0g
Ki8KLVdlZWsucHJvdG90eXBlLmxhc3REYXkgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5l
cXVhbHMoV2Vlay5NYXhpbXVtKSkKLSAgICAgICAgcmV0dXJuIERheS5NYXhpbXVtOwotICAgIHJl
dHVybiB0aGlzLm5leHQoKS5maXJzdERheSgpLnByZXZpb3VzKCk7Ci19OwotCi0vKioKLSAqIEBy
ZXR1cm4geyFudW1iZXJ9Ci0gKi8KLVdlZWsucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbigp
IHsKLSAgICByZXR1cm4gdGhpcy5maXJzdERheSgpLnZhbHVlT2YoKSAtIGNyZWF0ZVVUQ0RhdGUo
MTk3MCwgMCwgMSkuZ2V0VGltZSgpOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshc3RyaW5nfQot
ICovCi1XZWVrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewotICAgIHZhciB5ZWFy
U3RyaW5nID0gU3RyaW5nKHRoaXMueWVhcik7Ci0gICAgaWYgKHllYXJTdHJpbmcubGVuZ3RoIDwg
NCkKLSAgICAgICAgeWVhclN0cmluZyA9ICgiMDAwIiArIHllYXJTdHJpbmcpLnN1YnN0cigtNCwg
NCk7Ci0gICAgcmV0dXJuIHllYXJTdHJpbmcgKyAiLVciICsgKCIwIiArIHRoaXMud2Vlaykuc3Vi
c3RyKC0yLCAyKTsKLX07Ci0KLS8qKgotICogQGNvbnN0cnVjdG9yCi0gKiBAZXh0ZW5kcyBEYXRl
VHlwZQotICogQHBhcmFtIHshbnVtYmVyfSB5ZWFyCi0gKiBAcGFyYW0geyFudW1iZXJ9IG1vbnRo
Ci0gKi8KLWZ1bmN0aW9uIE1vbnRoKHllYXIsIG1vbnRoKSB7IAotICAgIC8qKgotICAgICAqIEB0
eXBlIHtudW1iZXJ9Ci0gICAgICogQGNvbnN0Ci0gICAgICovCi0gICAgdGhpcy55ZWFyID0geWVh
ciArIE1hdGguZmxvb3IobW9udGggLyBNb250aHNQZXJZZWFyKTsKLSAgICAvKioKLSAgICAgKiBA
dHlwZSB7bnVtYmVyfQotICAgICAqIEBjb25zdAotICAgICAqLwotICAgIHRoaXMubW9udGggPSBt
b250aCAlIE1vbnRoc1BlclllYXIgPCAwID8gbW9udGggJSBNb250aHNQZXJZZWFyICsgTW9udGhz
UGVyWWVhciA6IG1vbnRoICUgTW9udGhzUGVyWWVhcjsKLX07Ci0KLU1vbnRoLklTT1N0cmluZ1Jl
Z0V4cCA9IC9eKFxkKyktKFxkKykkLzsKLQotLy8gU2VlIFdlYkNvcmUvcGxhdGZvcm0vRGF0ZUNv
bXBvbmVudHMuaC4KLU1vbnRoLk1pbmltdW0gPSBuZXcgTW9udGgoMSwgMCk7Ci1Nb250aC5NYXhp
bXVtID0gbmV3IE1vbnRoKDI3NTc2MCwgOCk7Ci0KLS8vIFNlZSBXZWJDb3JlL2h0bWwvTW9udGhJ
bnB1dFR5cGUuY3BwLgotTW9udGguRGVmYXVsdFN0ZXAgPSAxOwotTW9udGguRGVmYXVsdFN0ZXBC
YXNlID0gMDsKLQotLyoqCi0gKiBAcGFyYW0geyFzdHJpbmd9IHN0cgotICogQHJldHVybiB7P01v
bnRofQotICovCi1Nb250aC5wYXJzZSA9IGZ1bmN0aW9uKHN0cikgewotICAgIHZhciBtYXRjaCA9
IE1vbnRoLklTT1N0cmluZ1JlZ0V4cC5leGVjKHN0cik7Ci0gICAgaWYgKCFtYXRjaCkKLSAgICAg
ICAgcmV0dXJuIG51bGw7Ci0gICAgdmFyIHllYXIgPSBwYXJzZUludChtYXRjaFsxXSwgMTApOwot
ICAgIHZhciBtb250aCA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCkgLSAxOwotICAgIHJldHVybiBu
ZXcgTW9udGgoeWVhciwgbW9udGgpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IHZh
bHVlCi0gKiBAcmV0dXJuIHshTW9udGh9Ci0gKi8KLU1vbnRoLmNyZWF0ZUZyb21WYWx1ZSA9IGZ1
bmN0aW9uKG1vbnRoc1NpbmNlRXBvY2gpIHsKLSAgICByZXR1cm4gbmV3IE1vbnRoKDE5NzAsIG1v
bnRoc1NpbmNlRXBvY2gpCi19OwotCi0vKioKLSAqIEBwYXJhbSB7IURhdGV9IGRhdGUKLSAqIEBy
ZXR1cm4geyFNb250aH0KLSAqLwotTW9udGguY3JlYXRlRnJvbURhdGUgPSBmdW5jdGlvbihkYXRl
KSB7Ci0gICAgaWYgKGlzTmFOKGRhdGUudmFsdWVPZigpKSkKLSAgICAgICAgdGhyb3cgIkludmFs
aWQgZGF0ZSI7Ci0gICAgcmV0dXJuIG5ldyBNb250aChkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIGRh
dGUuZ2V0VVRDTW9udGgoKSk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IURheX0gZGF5Ci0gKiBA
cmV0dXJuIHshTW9udGh9Ci0gKi8KLU1vbnRoLmNyZWF0ZUZyb21EYXkgPSBmdW5jdGlvbihkYXkp
IHsKLSAgICByZXR1cm4gbmV3IE1vbnRoKGRheS55ZWFyLCBkYXkubW9udGgpOwotfTsKLQotLyoq
Ci0gKiBAcmV0dXJuIHshTW9udGh9Ci0gKi8KLU1vbnRoLmNyZWF0ZUZyb21Ub2RheSA9IGZ1bmN0
aW9uKCkgewotICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpOwotICAgIHJldHVybiBuZXcgTW9udGgo
bm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpKTsKLX07Ci0KLS8qKgotICogQHJldHVy
biB7IWJvb2xlYW59Ci0gKi8KLU1vbnRoLnByb3RvdHlwZS5jb250YWluc0RheSA9IGZ1bmN0aW9u
KGRheSkgewotICAgIHJldHVybiB0aGlzLnllYXIgPT09IGRheS55ZWFyICYmIHRoaXMubW9udGgg
PT09IGRheS5tb250aDsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshTW9udGh9IG90aGVyCi0gKiBA
cmV0dXJuIHshYm9vbGVhbn0KLSAqLwotTW9udGgucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9u
KG90aGVyKSB7Ci0gICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgTW9udGggJiYgdGhpcy55ZWFy
ID09PSBvdGhlci55ZWFyICYmIHRoaXMubW9udGggPT09IG90aGVyLm1vbnRoOwotfTsKLQotLyoq
Ci0gKiBAcGFyYW0geyFudW1iZXI9fSBvZmZzZXQKLSAqIEByZXR1cm4geyFNb250aH0KLSAqLwot
TW9udGgucHJvdG90eXBlLnByZXZpb3VzID0gZnVuY3Rpb24ob2Zmc2V0KSB7Ci0gICAgaWYgKHR5
cGVvZiBvZmZzZXQgPT09ICJ1bmRlZmluZWQiKQotICAgICAgICBvZmZzZXQgPSAxOwotICAgIHJl
dHVybiBuZXcgTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoIC0gb2Zmc2V0KTsKLX07Ci0KLS8q
KgotICogQHBhcmFtIHshbnVtYmVyPX0gb2Zmc2V0Ci0gKiBAcmV0dXJuIHshTW9udGh9Ci0gKi8K
LU1vbnRoLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24ob2Zmc2V0KSB7Ci0gICAgaWYgKHR5cGVv
ZiBvZmZzZXQgPT09ICJ1bmRlZmluZWQiKQotICAgICAgICBvZmZzZXQgPSAxOwotICAgIHJldHVy
biBuZXcgTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoICsgb2Zmc2V0KTsKLX07Ci0KLS8qKgot
ICogQHJldHVybiB7IURhdGV9Ci0gKi8KLU1vbnRoLnByb3RvdHlwZS5zdGFydERhdGUgPSBmdW5j
dGlvbigpIHsKLSAgICByZXR1cm4gY3JlYXRlVVRDRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgs
IDEpOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshRGF0ZX0KLSAqLwotTW9udGgucHJvdG90eXBl
LmVuZERhdGUgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5lcXVhbHMoTW9udGguTWF4aW11
bSkpCi0gICAgICAgIHJldHVybiBEYXkuTWF4aW11bS5zdGFydERhdGUoKTsKLSAgICByZXR1cm4g
dGhpcy5uZXh0KCkuc3RhcnREYXRlKCk7Ci19OwotCi0vKioKLSAqIEByZXR1cm4geyFEYXl9Ci0g
Ki8KLU1vbnRoLnByb3RvdHlwZS5maXJzdERheSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBu
ZXcgRGF5KHRoaXMueWVhciwgdGhpcy5tb250aCwgMSk7Ci19OwotCi0vKioKLSAqIEByZXR1cm4g
eyFEYXl9Ci0gKi8KLU1vbnRoLnByb3RvdHlwZS5taWRkbGVEYXkgPSBmdW5jdGlvbigpIHsKLSAg
ICByZXR1cm4gbmV3IERheSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMubW9udGggPT09IDIg
PyAxNCA6IDE1KTsKLX07Ci0KLS8qKgotICogQHJldHVybiB7IURheX0KLSAqLwotTW9udGgucHJv
dG90eXBlLmxhc3REYXkgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5lcXVhbHMoTW9udGgu
TWF4aW11bSkpCi0gICAgICAgIHJldHVybiBEYXkuTWF4aW11bTsKLSAgICByZXR1cm4gdGhpcy5u
ZXh0KCkuZmlyc3REYXkoKS5wcmV2aW91cygpOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshbnVt
YmVyfQotICovCi1Nb250aC5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uKCkgewotICAgIHJl
dHVybiAodGhpcy55ZWFyIC0gMTk3MCkgKiBNb250aHNQZXJZZWFyICsgdGhpcy5tb250aDsKLX07
Ci0KLS8qKgotICogQHJldHVybiB7IXN0cmluZ30KLSAqLwotTW9udGgucHJvdG90eXBlLnRvU3Ry
aW5nID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHllYXJTdHJpbmcgPSBTdHJpbmcodGhpcy55ZWFy
KTsKLSAgICBpZiAoeWVhclN0cmluZy5sZW5ndGggPCA0KQotICAgICAgICB5ZWFyU3RyaW5nID0g
KCIwMDAiICsgeWVhclN0cmluZykuc3Vic3RyKC00LCA0KTsKLSAgICByZXR1cm4geWVhclN0cmlu
ZyArICItIiArICgiMCIgKyAodGhpcy5tb250aCArIDEpKS5zdWJzdHIoLTIsIDIpOwotfTsKLQot
LyoqCi0gKiBAcmV0dXJuIHshc3RyaW5nfQotICovCi1Nb250aC5wcm90b3R5cGUudG9Mb2NhbGVT
dHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAoZ2xvYmFsLnBhcmFtcy5sb2NhbGUgPT09ICJq
YSIpCi0gICAgICAgIHJldHVybiAiIiArIHRoaXMueWVhciArICLlubQiICsgZm9ybWF0SmFwYW5l
c2VJbXBlcmlhbEVyYSh0aGlzLnllYXIsIHRoaXMubW9udGgpICsgIiAiICsgKHRoaXMubW9udGgg
KyAxKSArICLmnIgiOwotICAgIHJldHVybiB3aW5kb3cucGFnZVBvcHVwQ29udHJvbGxlci5mb3Jt
YXRNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHsh
c3RyaW5nfQotICovCi1Nb250aC5wcm90b3R5cGUudG9TaG9ydExvY2FsZVN0cmluZyA9IGZ1bmN0
aW9uKCkgewotICAgIHJldHVybiB3aW5kb3cucGFnZVBvcHVwQ29udHJvbGxlci5mb3JtYXRTaG9y
dE1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbml0
aWFsaXphdGlvbgotCi0vKioKLSAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50Ci0gKi8KLWZ1bmN0aW9u
IGhhbmRsZU1lc3NhZ2UoZXZlbnQpIHsKLSAgICBpZiAoZ2xvYmFsLmFyZ3VtZW50c1JlY2VpdmVk
KQotICAgICAgICByZXR1cm47Ci0gICAgZ2xvYmFsLmFyZ3VtZW50c1JlY2VpdmVkID0gdHJ1ZTsK
LSAgICBpbml0aWFsaXplKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpOwotfQotCi0vKioKLSAqIEBw
YXJhbSB7IU9iamVjdH0gcGFyYW1zCi0gKi8KLWZ1bmN0aW9uIHNldEdsb2JhbFBhcmFtcyhwYXJh
bXMpIHsKLSAgICB2YXIgbmFtZTsKLSAgICBmb3IgKG5hbWUgaW4gZ2xvYmFsLnBhcmFtcykgewot
ICAgICAgICBpZiAodHlwZW9mIHBhcmFtc1tuYW1lXSA9PT0gInVuZGVmaW5lZCIpCi0gICAgICAg
ICAgICBjb25zb2xlLndhcm4oIk1pc3NpbmcgYXJndW1lbnQ6ICIgKyBuYW1lKTsKLSAgICB9Ci0g
ICAgZm9yIChuYW1lIGluIHBhcmFtcykgewotICAgICAgICBnbG9iYWwucGFyYW1zW25hbWVdID0g
cGFyYW1zW25hbWVdOwotICAgIH0KLX07Ci0KLS8qKgotICogQHBhcmFtIHshT2JqZWN0fSBhcmdz
Ci0gKi8KLWZ1bmN0aW9uIGluaXRpYWxpemUoYXJncykgeyAKLSAgICBzZXRHbG9iYWxQYXJhbXMo
YXJncyk7Ci0gICAgaWYgKGdsb2JhbC5wYXJhbXMuc3VnZ2VzdGlvblZhbHVlcyAmJiBnbG9iYWwu
cGFyYW1zLnN1Z2dlc3Rpb25WYWx1ZXMubGVuZ3RoKQotICAgICAgICBvcGVuU3VnZ2VzdGlvblBp
Y2tlcigpOwotICAgIGVsc2UKLSAgICAgICAgb3BlbkNhbGVuZGFyUGlja2VyKCk7Ci19Ci0KLWZ1
bmN0aW9uIGNsb3NlUGlja2VyKCkgewotICAgIGlmIChnbG9iYWwucGlja2VyKQotICAgICAgICBn
bG9iYWwucGlja2VyLmNsZWFudXAoKTsKLSAgICB2YXIgbWFpbiA9ICQoIm1haW4iKTsKLSAgICBt
YWluLmlubmVySFRNTCA9ICIiOwotICAgIG1haW4uY2xhc3NOYW1lID0gIiI7Ci19OwotCi1mdW5j
dGlvbiBvcGVuU3VnZ2VzdGlvblBpY2tlcigpIHsKLSAgICBjbG9zZVBpY2tlcigpOwotICAgIGds
b2JhbC5waWNrZXIgPSBuZXcgU3VnZ2VzdGlvblBpY2tlcigkKCJtYWluIiksIGdsb2JhbC5wYXJh
bXMpOwotfTsKLQotZnVuY3Rpb24gb3BlbkNhbGVuZGFyUGlja2VyKCkgewotICAgIGNsb3NlUGlj
a2VyKCk7Ci0gICAgZ2xvYmFsLnBpY2tlciA9IG5ldyBDYWxlbmRhclBpY2tlcihnbG9iYWwucGFy
YW1zLm1vZGUsIGdsb2JhbC5wYXJhbXMpOwotICAgIGdsb2JhbC5waWNrZXIuYXR0YWNoVG8oJCgi
bWFpbiIpKTsKLX07Ci0KLS8qKgotICogQGNvbnN0cnVjdG9yCi0gKi8KLWZ1bmN0aW9uIEV2ZW50
RW1pdHRlcigpIHsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshc3RyaW5nfSB0eXBlCi0gKiBAcGFy
YW0geyFmdW5jdGlvbih7Li4uKn0pfSBjYWxsYmFjawotICovCi1FdmVudEVtaXR0ZXIucHJvdG90
eXBlLm9uID0gZnVuY3Rpb24odHlwZSwgY2FsbGJhY2spIHsKLSAgICBjb25zb2xlLmFzc2VydChj
YWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKTsKLSAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykK
LSAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0ge307Ci0gICAgaWYgKCF0aGlzLl9jYWxsYmFja3Nb
dHlwZV0pCi0gICAgICAgIHRoaXMuX2NhbGxiYWNrc1t0eXBlXSA9IFtdOwotICAgIHRoaXMuX2Nh
bGxiYWNrc1t0eXBlXS5wdXNoKGNhbGxiYWNrKTsKLX07Ci0KLUV2ZW50RW1pdHRlci5wcm90b3R5
cGUuaGFzTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlKSB7Ci0gICAgaWYgKCF0aGlzLl9jYWxsYmFj
a3MpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB2YXIgY2FsbGJhY2tzRm9yVHlwZSA9IHRo
aXMuX2NhbGxiYWNrc1t0eXBlXTsKLSAgICBpZiAoIWNhbGxiYWNrc0ZvclR5cGUpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gY2FsbGJhY2tzRm9yVHlwZS5sZW5ndGggPiAwOwot
fTsKLQotLyoqCi0gKiBAcGFyYW0geyFzdHJpbmd9IHR5cGUKLSAqIEBwYXJhbSB7IWZ1bmN0aW9u
KE9iamVjdCl9IGNhbGxiYWNrCi0gKi8KLUV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlz
dGVuZXIgPSBmdW5jdGlvbih0eXBlLCBjYWxsYmFjaykgewotICAgIGlmICghdGhpcy5fY2FsbGJh
Y2tzKQotICAgICAgICByZXR1cm47Ci0gICAgdmFyIGNhbGxiYWNrc0ZvclR5cGUgPSB0aGlzLl9j
YWxsYmFja3NbdHlwZV07Ci0gICAgaWYgKCFjYWxsYmFja3NGb3JUeXBlKQotICAgICAgICByZXR1
cm47Ci0gICAgY2FsbGJhY2tzRm9yVHlwZS5zcGxpY2UoY2FsbGJhY2tzRm9yVHlwZS5pbmRleE9m
KGNhbGxiYWNrKSwgMSk7Ci0gICAgaWYgKGNhbGxiYWNrc0ZvclR5cGUubGVuZ3RoID09PSAwKQot
ICAgICAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzW3R5cGVdOwotfTsKLQotLyoqCi0gKiBAcGFy
YW0geyFzdHJpbmd9IHR5cGUKLSAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MKLSAqLwotRXZlbnRF
bWl0dGVyLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24odHlwZSkgewotICAgIGlm
ICghdGhpcy5fY2FsbGJhY2tzKQotICAgICAgICByZXR1cm47Ci0gICAgdmFyIGNhbGxiYWNrc0Zv
clR5cGUgPSB0aGlzLl9jYWxsYmFja3NbdHlwZV07Ci0gICAgaWYgKCFjYWxsYmFja3NGb3JUeXBl
KQotICAgICAgICByZXR1cm47Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3NGb3JU
eXBlLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgIGNhbGxiYWNrc0ZvclR5cGVbaV0uYXBwbHkodGhp
cywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7Ci0gICAgfQotfTsK
LQotLy8gUGFyYW1ldGVyIHQgc2hvdWxkIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS4KLXZh
ciBBbmltYXRpb25UaW1pbmdGdW5jdGlvbiA9IHsKLSAgICBMaW5lYXI6IGZ1bmN0aW9uKHQpewot
ICAgICAgICByZXR1cm4gdDsKLSAgICB9LAotICAgIEVhc2VJbk91dDogZnVuY3Rpb24odCl7Ci0g
ICAgICAgIHQgKj0gMjsKLSAgICAgICAgaWYgKHQgPCAxKQotICAgICAgICAgICAgcmV0dXJuIE1h
dGgucG93KHQsIDMpIC8gMjsKLSAgICAgICAgdCAtPSAyOwotICAgICAgICByZXR1cm4gTWF0aC5w
b3codCwgMykgLyAyICsgMTsKLSAgICB9Ci19OwotCi0vKioKLSAqIEBjb25zdHJ1Y3RvcgotICog
QGV4dGVuZHMgRXZlbnRFbWl0dGVyCi0gKi8KLWZ1bmN0aW9uIEFuaW1hdGlvbk1hbmFnZXIoKSB7
Ci0gICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7Ci0KLSAgICB0aGlzLl9pc1J1bm5pbmcgPSBm
YWxzZTsKLSAgICB0aGlzLl9ydW5uaW5nQW5pbWF0b3JDb3VudCA9IDA7Ci0gICAgdGhpcy5fcnVu
bmluZ0FuaW1hdG9ycyA9IHt9OwotICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lQ2FsbGJhY2tCb3Vu
ZCA9IHRoaXMuX2FuaW1hdGlvbkZyYW1lQ2FsbGJhY2suYmluZCh0aGlzKTsKLX0KLQotQW5pbWF0
aW9uTWFuYWdlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50RW1pdHRlci5wcm90b3R5
cGUpOwotCi1BbmltYXRpb25NYW5hZ2VyLkV2ZW50VHlwZUFuaW1hdGlvbkZyYW1lV2lsbEZpbmlz
aCA9ICJhbmltYXRpb25GcmFtZVdpbGxGaW5pc2giOwotCi1BbmltYXRpb25NYW5hZ2VyLnByb3Rv
dHlwZS5fc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5faXNSdW5u
aW5nKQotICAgICAgICByZXR1cm47Ci0gICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTsKLSAgICB3
aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lQ2Fs
bGJhY2tCb3VuZCk7Ci19OwotCi1BbmltYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5fc3RvcEFuaW1h
dGlvbiA9IGZ1bmN0aW9uKCkgewotICAgIGlmICghdGhpcy5faXNSdW5uaW5nKQotICAgICAgICBy
ZXR1cm47Ci0gICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7Ci19OwotCi0vKioKLSAqIEBwYXJh
bSB7IUFuaW1hdG9yfSBhbmltYXRvcgotICovCi1BbmltYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5h
ZGQgPSBmdW5jdGlvbihhbmltYXRvcikgewotICAgIGlmICh0aGlzLl9ydW5uaW5nQW5pbWF0b3Jz
W2FuaW1hdG9yLmlkXSkKLSAgICAgICAgcmV0dXJuOwotICAgIHRoaXMuX3J1bm5pbmdBbmltYXRv
cnNbYW5pbWF0b3IuaWRdID0gYW5pbWF0b3I7Ci0gICAgdGhpcy5fcnVubmluZ0FuaW1hdG9yQ291
bnQrKzsKLSAgICBpZiAodGhpcy5fbmVlZHNUaW1lcigpKQotICAgICAgICB0aGlzLl9zdGFydEFu
aW1hdGlvbigpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFBbmltYXRvcn0gYW5pbWF0b3IKLSAq
LwotQW5pbWF0aW9uTWFuYWdlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oYW5pbWF0b3Ip
IHsKLSAgICBpZiAoIXRoaXMuX3J1bm5pbmdBbmltYXRvcnNbYW5pbWF0b3IuaWRdKQotICAgICAg
ICByZXR1cm47Ci0gICAgZGVsZXRlIHRoaXMuX3J1bm5pbmdBbmltYXRvcnNbYW5pbWF0b3IuaWRd
OwotICAgIHRoaXMuX3J1bm5pbmdBbmltYXRvckNvdW50LS07Ci0gICAgaWYgKCF0aGlzLl9uZWVk
c1RpbWVyKCkpCi0gICAgICAgIHRoaXMuX3N0b3BBbmltYXRpb24oKTsKLX07Ci0KLUFuaW1hdGlv
bk1hbmFnZXIucHJvdG90eXBlLl9hbmltYXRpb25GcmFtZUNhbGxiYWNrID0gZnVuY3Rpb24obm93
KSB7Ci0gICAgaWYgKHRoaXMuX3J1bm5pbmdBbmltYXRvckNvdW50ID4gMCkgewotICAgICAgICBm
b3IgKHZhciBpZCBpbiB0aGlzLl9ydW5uaW5nQW5pbWF0b3JzKSB7Ci0gICAgICAgICAgICB0aGlz
Ll9ydW5uaW5nQW5pbWF0b3JzW2lkXS5vbkFuaW1hdGlvbkZyYW1lKG5vdyk7Ci0gICAgICAgIH0K
LSAgICB9Ci0gICAgdGhpcy5kaXNwYXRjaEV2ZW50KEFuaW1hdGlvbk1hbmFnZXIuRXZlbnRUeXBl
QW5pbWF0aW9uRnJhbWVXaWxsRmluaXNoKTsKLSAgICBpZiAodGhpcy5faXNSdW5uaW5nKQotICAg
ICAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZy
YW1lQ2FsbGJhY2tCb3VuZCk7Ci19OwotCi0vKioKLSAqIEByZXR1cm4geyFib29sZWFufQotICov
Ci1BbmltYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5fbmVlZHNUaW1lciA9IGZ1bmN0aW9uKCkgewot
ICAgIHJldHVybiB0aGlzLl9ydW5uaW5nQW5pbWF0b3JDb3VudCA+IDAgfHwgdGhpcy5oYXNMaXN0
ZW5lcihBbmltYXRpb25NYW5hZ2VyLkV2ZW50VHlwZUFuaW1hdGlvbkZyYW1lV2lsbEZpbmlzaCk7
Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IXN0cmluZ30gdHlwZQotICogQHBhcmFtIHshRnVuY3Rp
b259IGNhbGxiYWNrCi0gKiBAb3ZlcnJpZGUKLSAqLwotQW5pbWF0aW9uTWFuYWdlci5wcm90b3R5
cGUub24gPSBmdW5jdGlvbih0eXBlLCBjYWxsYmFjaykgewotICAgIEV2ZW50RW1pdHRlci5wcm90
b3R5cGUub24uY2FsbCh0aGlzLCB0eXBlLCBjYWxsYmFjayk7Ci0gICAgaWYgKHRoaXMuX25lZWRz
VGltZXIoKSkKLSAgICAgICAgdGhpcy5fc3RhcnRBbmltYXRpb24oKTsKLX07Ci0KLS8qKgotICog
QHBhcmFtIHshc3RyaW5nfSB0eXBlCi0gKiBAcGFyYW0geyFGdW5jdGlvbn0gY2FsbGJhY2sKLSAq
IEBvdmVycmlkZQotICovCi1BbmltYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5l
ciA9IGZ1bmN0aW9uKHR5cGUsIGNhbGxiYWNrKSB7Ci0gICAgRXZlbnRFbWl0dGVyLnByb3RvdHlw
ZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIHR5cGUsIGNhbGxiYWNrKTsKLSAgICBpZiAoIXRo
aXMuX25lZWRzVGltZXIoKSkKLSAgICAgICAgdGhpcy5fc3RvcEFuaW1hdGlvbigpOwotfTsKLQot
QW5pbWF0aW9uTWFuYWdlci5zaGFyZWQgPSBuZXcgQW5pbWF0aW9uTWFuYWdlcigpOwotCi0vKioK
LSAqIEBjb25zdHJ1Y3RvcgotICogQGV4dGVuZHMgRXZlbnRFbWl0dGVyCi0gKi8KLWZ1bmN0aW9u
IEFuaW1hdG9yKCkgewotICAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOwotCi0gICAgLyoqCi0g
ICAgICogQHR5cGUgeyFudW1iZXJ9Ci0gICAgICogQGNvbnN0Ci0gICAgICovCi0gICAgdGhpcy5p
ZCA9IEFuaW1hdG9yLl9sYXN0SWQrKzsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IW51bWJlcn0K
LSAgICAgKi8KLSAgICB0aGlzLmR1cmF0aW9uID0gMTAwOwotICAgIC8qKgotICAgICAqIEB0eXBl
IHs/ZnVuY3Rpb259Ci0gICAgICovCi0gICAgdGhpcy5zdGVwID0gbnVsbDsKLSAgICAvKioKLSAg
ICAgKiBAdHlwZSB7IWJvb2xlYW59Ci0gICAgICogQHByb3RlY3RlZAotICAgICAqLwotICAgIHRo
aXMuX2lzUnVubmluZyA9IGZhbHNlOwotICAgIC8qKgotICAgICAqIEB0eXBlIHshbnVtYmVyfQot
ICAgICAqLwotICAgIHRoaXMuY3VycmVudFZhbHVlID0gMDsKLSAgICAvKioKLSAgICAgKiBAdHlw
ZSB7IW51bWJlcn0KLSAgICAgKiBAcHJvdGVjdGVkCi0gICAgICovCi0gICAgdGhpcy5fbGFzdFN0
ZXBUaW1lID0gMDsKLX0KLQotQW5pbWF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFdmVu
dEVtaXR0ZXIucHJvdG90eXBlKTsKLQotQW5pbWF0b3IuX2xhc3RJZCA9IDA7Ci0KLUFuaW1hdG9y
LkV2ZW50VHlwZURpZEFuaW1hdGlvblN0b3AgPSAiZGlkQW5pbWF0aW9uU3RvcCI7Ci0KLS8qKgot
ICogQHJldHVybiB7IWJvb2xlYW59Ci0gKi8KLUFuaW1hdG9yLnByb3RvdHlwZS5pc1J1bm5pbmcg
PSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5faXNSdW5uaW5nOwotfTsKLQotQW5pbWF0
b3IucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fbGFzdFN0ZXBUaW1l
ID0gRGF0ZS5ub3coKTsKLSAgICB0aGlzLl9pc1J1bm5pbmcgPSB0cnVlOwotICAgIEFuaW1hdGlv
bk1hbmFnZXIuc2hhcmVkLmFkZCh0aGlzKTsKLX07Ci0KLUFuaW1hdG9yLnByb3RvdHlwZS5zdG9w
ID0gZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0aGlzLl9pc1J1bm5pbmcpCi0gICAgICAgIHJldHVy
bjsKLSAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTsKLSAgICBBbmltYXRpb25NYW5hZ2VyLnNo
YXJlZC5yZW1vdmUodGhpcyk7Ci0gICAgdGhpcy5kaXNwYXRjaEV2ZW50KEFuaW1hdG9yLkV2ZW50
VHlwZURpZEFuaW1hdGlvblN0b3AsIHRoaXMpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFudW1i
ZXJ9IG5vdwotICovCi1BbmltYXRvci5wcm90b3R5cGUub25BbmltYXRpb25GcmFtZSA9IGZ1bmN0
aW9uKG5vdykgewotICAgIHRoaXMuX2xhc3RTdGVwVGltZSA9IG5vdzsKLSAgICB0aGlzLnN0ZXAo
dGhpcyk7Ci19OwotCi0vKioKLSAqIEBjb25zdHJ1Y3RvcgotICogQGV4dGVuZHMgQW5pbWF0b3IK
LSAqLwotZnVuY3Rpb24gVHJhbnNpdGlvbkFuaW1hdG9yKCkgewotICAgIEFuaW1hdG9yLmNhbGwo
dGhpcyk7Ci0gICAgLyoqCi0gICAgICogQHR5cGUgeyFudW1iZXJ9Ci0gICAgICogQHByb3RlY3Rl
ZAotICAgICAqLwotICAgIHRoaXMuX2Zyb20gPSAwOwotICAgIC8qKgotICAgICAqIEB0eXBlIHsh
bnVtYmVyfQotICAgICAqIEBwcm90ZWN0ZWQKLSAgICAgKi8KLSAgICB0aGlzLl90byA9IDA7Ci0g
ICAgLyoqCi0gICAgICogQHR5cGUgeyFudW1iZXJ9Ci0gICAgICogQHByb3RlY3RlZAotICAgICAq
LwotICAgIHRoaXMuX2RlbHRhID0gMDsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IW51bWJlcn0K
LSAgICAgKi8KLSAgICB0aGlzLnByb2dyZXNzID0gMC4wOwotICAgIC8qKgotICAgICAqIEB0eXBl
IHshZnVuY3Rpb259Ci0gICAgICovCi0gICAgdGhpcy50aW1pbmdGdW5jdGlvbiA9IEFuaW1hdGlv
blRpbWluZ0Z1bmN0aW9uLkxpbmVhcjsKLX0KLQotVHJhbnNpdGlvbkFuaW1hdG9yLnByb3RvdHlw
ZSA9IE9iamVjdC5jcmVhdGUoQW5pbWF0b3IucHJvdG90eXBlKTsKLQotLyoqCi0gKiBAcGFyYW0g
eyFudW1iZXJ9IHZhbHVlCi0gKi8KLVRyYW5zaXRpb25BbmltYXRvci5wcm90b3R5cGUuc2V0RnJv
bSA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgdGhpcy5fZnJvbSA9IHZhbHVlOwotICAgIHRoaXMu
X2RlbHRhID0gdGhpcy5fdG8gLSB0aGlzLl9mcm9tOwotfTsKLQotVHJhbnNpdGlvbkFuaW1hdG9y
LnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkgewotICAgIGNvbnNvbGUuYXNzZXJ0KGlzRmlu
aXRlKHRoaXMuZHVyYXRpb24pKTsKLSAgICB0aGlzLnByb2dyZXNzID0gMC4wOwotICAgIHRoaXMu
Y3VycmVudFZhbHVlID0gdGhpcy5fZnJvbTsKLSAgICBBbmltYXRvci5wcm90b3R5cGUuc3RhcnQu
Y2FsbCh0aGlzKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSB2YWx1ZQotICovCi1U
cmFuc2l0aW9uQW5pbWF0b3IucHJvdG90eXBlLnNldFRvID0gZnVuY3Rpb24odmFsdWUpIHsKLSAg
ICB0aGlzLl90byA9IHZhbHVlOwotICAgIHRoaXMuX2RlbHRhID0gdGhpcy5fdG8gLSB0aGlzLl9m
cm9tOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IG5vdwotICovCi1UcmFuc2l0aW9u
QW5pbWF0b3IucHJvdG90eXBlLm9uQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbihub3cpIHsKLSAg
ICB0aGlzLnByb2dyZXNzICs9IChub3cgLSB0aGlzLl9sYXN0U3RlcFRpbWUpIC8gdGhpcy5kdXJh
dGlvbjsKLSAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMS4wLCB0aGlzLnByb2dyZXNzKTsK
LSAgICB0aGlzLl9sYXN0U3RlcFRpbWUgPSBub3c7Ci0gICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0
aGlzLnRpbWluZ0Z1bmN0aW9uKHRoaXMucHJvZ3Jlc3MpICogdGhpcy5fZGVsdGEgKyB0aGlzLl9m
cm9tOwotICAgIHRoaXMuc3RlcCh0aGlzKTsKLSAgICBpZiAodGhpcy5wcm9ncmVzcyA9PT0gMS4w
KSB7Ci0gICAgICAgIHRoaXMuc3RvcCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfTsKLQot
LyoqCi0gKiBAY29uc3RydWN0b3IKLSAqIEBleHRlbmRzIEFuaW1hdG9yCi0gKiBAcGFyYW0geyFu
dW1iZXJ9IGluaXRpYWxWZWxvY2l0eQotICogQHBhcmFtIHshbnVtYmVyfSBpbml0aWFsVmFsdWUK
LSAqLwotZnVuY3Rpb24gRmxpbmdHZXN0dXJlQW5pbWF0b3IoaW5pdGlhbFZlbG9jaXR5LCBpbml0
aWFsVmFsdWUpIHsKLSAgICBBbmltYXRvci5jYWxsKHRoaXMpOwotICAgIC8qKgotICAgICAqIEB0
eXBlIHshbnVtYmVyfQotICAgICAqLwotICAgIHRoaXMuaW5pdGlhbFZlbG9jaXR5ID0gaW5pdGlh
bFZlbG9jaXR5OwotICAgIC8qKgotICAgICAqIEB0eXBlIHshbnVtYmVyfQotICAgICAqLwotICAg
IHRoaXMuaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlOwotICAgIC8qKgotICAgICAqIEB0eXBl
IHshbnVtYmVyfQotICAgICAqIEBwcm90ZWN0ZWQKLSAgICAgKi8KLSAgICB0aGlzLl9lbGFwc2Vk
VGltZSA9IDA7Ci0gICAgdmFyIHN0YXJ0VmVsb2NpdHkgPSBNYXRoLmFicyh0aGlzLmluaXRpYWxW
ZWxvY2l0eSk7Ci0gICAgaWYgKHN0YXJ0VmVsb2NpdHkgPiB0aGlzLl92ZWxvY2l0eUF0VGltZSgw
KSkKLSAgICAgICAgc3RhcnRWZWxvY2l0eSA9IHRoaXMuX3ZlbG9jaXR5QXRUaW1lKDApOwotICAg
IGlmIChzdGFydFZlbG9jaXR5IDwgMCkKLSAgICAgICAgc3RhcnRWZWxvY2l0eSA9IDA7Ci0gICAg
LyoqCi0gICAgICogQHR5cGUgeyFudW1iZXJ9Ci0gICAgICogQHByb3RlY3RlZAotICAgICAqLwot
ICAgIHRoaXMuX3RpbWVPZmZzZXQgPSB0aGlzLl90aW1lQXRWZWxvY2l0eShzdGFydFZlbG9jaXR5
KTsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IW51bWJlcn0KLSAgICAgKiBAcHJvdGVjdGVkCi0g
ICAgICovCi0gICAgdGhpcy5fcG9zaXRpb25PZmZzZXQgPSB0aGlzLl92YWx1ZUF0VGltZSh0aGlz
Ll90aW1lT2Zmc2V0KTsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IW51bWJlcn0KLSAgICAgKi8K
LSAgICB0aGlzLmR1cmF0aW9uID0gdGhpcy5fdGltZUF0VmVsb2NpdHkoMCk7Ci19Ci0KLUZsaW5n
R2VzdHVyZUFuaW1hdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQW5pbWF0b3IucHJvdG90
eXBlKTsKLQotLy8gVmVsb2NpdHkgaXMgc3ViamVjdCB0byBleHBvbmVudGlhbCBkZWNheS4gVGhl
c2UgcGFyYW1ldGVycyBhcmUgY29lZmZpY2llbnRzCi0vLyB0aGF0IGRldGVybWluZSB0aGUgY3Vy
dmUuCi1GbGluZ0dlc3R1cmVBbmltYXRvci5fUDAgPSAtNTcwNy42MjsKLUZsaW5nR2VzdHVyZUFu
aW1hdG9yLl9QMSA9IDAuMTcyOwotRmxpbmdHZXN0dXJlQW5pbWF0b3IuX1AyID0gMC4wMDM3Owot
Ci0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gdAotICovCi1GbGluZ0dlc3R1cmVBbmltYXRvci5w
cm90b3R5cGUuX3ZhbHVlQXRUaW1lID0gZnVuY3Rpb24odCkgewotICAgIHJldHVybiBGbGluZ0dl
c3R1cmVBbmltYXRvci5fUDAgKiBNYXRoLmV4cCgtRmxpbmdHZXN0dXJlQW5pbWF0b3IuX1AyICog
dCkgLSBGbGluZ0dlc3R1cmVBbmltYXRvci5fUDEgKiB0IC0gRmxpbmdHZXN0dXJlQW5pbWF0b3Iu
X1AwOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IHQKLSAqLwotRmxpbmdHZXN0dXJl
QW5pbWF0b3IucHJvdG90eXBlLl92ZWxvY2l0eUF0VGltZSA9IGZ1bmN0aW9uKHQpIHsKLSAgICBy
ZXR1cm4gLUZsaW5nR2VzdHVyZUFuaW1hdG9yLl9QMCAqIEZsaW5nR2VzdHVyZUFuaW1hdG9yLl9Q
MiAqIE1hdGguZXhwKC1GbGluZ0dlc3R1cmVBbmltYXRvci5fUDIgKiB0KSAtIEZsaW5nR2VzdHVy
ZUFuaW1hdG9yLl9QMTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSB2Ci0gKi8KLUZs
aW5nR2VzdHVyZUFuaW1hdG9yLnByb3RvdHlwZS5fdGltZUF0VmVsb2NpdHkgPSBmdW5jdGlvbih2
KSB7Ci0gICAgcmV0dXJuIC1NYXRoLmxvZygodiArIEZsaW5nR2VzdHVyZUFuaW1hdG9yLl9QMSkg
LyAoLUZsaW5nR2VzdHVyZUFuaW1hdG9yLl9QMCAqIEZsaW5nR2VzdHVyZUFuaW1hdG9yLl9QMikp
IC8gRmxpbmdHZXN0dXJlQW5pbWF0b3IuX1AyOwotfTsKLQotRmxpbmdHZXN0dXJlQW5pbWF0b3Iu
cHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fbGFzdFN0ZXBUaW1lID0g
RGF0ZS5ub3coKTsKLSAgICBBbmltYXRvci5wcm90b3R5cGUuc3RhcnQuY2FsbCh0aGlzKTsKLX07
Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSBub3cKLSAqLwotRmxpbmdHZXN0dXJlQW5pbWF0
b3IucHJvdG90eXBlLm9uQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbihub3cpIHsKLSAgICB0aGlz
Ll9lbGFwc2VkVGltZSArPSBub3cgLSB0aGlzLl9sYXN0U3RlcFRpbWU7Ci0gICAgdGhpcy5fbGFz
dFN0ZXBUaW1lID0gbm93OwotICAgIGlmICh0aGlzLl9lbGFwc2VkVGltZSArIHRoaXMuX3RpbWVP
ZmZzZXQgPj0gdGhpcy5kdXJhdGlvbikgewotICAgICAgICB0aGlzLnN0b3AoKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICB2YXIgcG9zaXRpb24gPSB0aGlzLl92YWx1ZUF0VGltZSh0aGlz
Ll9lbGFwc2VkVGltZSArIHRoaXMuX3RpbWVPZmZzZXQpIC0gdGhpcy5fcG9zaXRpb25PZmZzZXQ7
Ci0gICAgaWYgKHRoaXMuaW5pdGlhbFZlbG9jaXR5IDwgMCkKLSAgICAgICAgcG9zaXRpb24gPSAt
cG9zaXRpb247Ci0gICAgdGhpcy5jdXJyZW50VmFsdWUgPSBwb3NpdGlvbiArIHRoaXMuaW5pdGlh
bFZhbHVlOwotICAgIHRoaXMuc3RlcCh0aGlzKTsKLX07Ci0KLS8qKgotICogQGNvbnN0cnVjdG9y
Ci0gKiBAZXh0ZW5kcyBFdmVudEVtaXR0ZXIKLSAqIEBwYXJhbSB7P0VsZW1lbnR9IGVsZW1lbnQK
LSAqIFZpZXcgYWRkcyBpdHNlbGYgYXMgYSBwcm9wZXJ0eSBvbiB0aGUgZWxlbWVudCBzbyB3ZSBj
YW4gYWNjZXNzIGl0IGZyb20gRXZlbnQudGFyZ2V0LgotICovCi1mdW5jdGlvbiBWaWV3KGVsZW1l
bnQpIHsKLSAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKLSAgICAvKioKLSAgICAgKiBAdHlw
ZSB7RWxlbWVudH0KLSAgICAgKiBAY29uc3QKLSAgICAgKi8KLSAgICB0aGlzLmVsZW1lbnQgPSBl
bGVtZW50IHx8IGNyZWF0ZUVsZW1lbnQoImRpdiIpOwotICAgIHRoaXMuZWxlbWVudC4kdmlldyA9
IHRoaXM7Ci0gICAgdGhpcy5iaW5kQ2FsbGJhY2tNZXRob2RzKCk7Ci19Ci0KLVZpZXcucHJvdG90
eXBlID0gT2JqZWN0LmNyZWF0ZShFdmVudEVtaXR0ZXIucHJvdG90eXBlKTsKLQotLyoqCi0gKiBA
cGFyYW0geyFFbGVtZW50fSBhbmNlc3RvckVsZW1lbnQKLSAqIEByZXR1cm4gez9PYmplY3R9Ci0g
Ki8KLVZpZXcucHJvdG90eXBlLm9mZnNldFJlbGF0aXZlVG8gPSBmdW5jdGlvbihhbmNlc3RvckVs
ZW1lbnQpIHsKLSAgICB2YXIgeCA9IDA7Ci0gICAgdmFyIHkgPSAwOwotICAgIHZhciBlbGVtZW50
ID0gdGhpcy5lbGVtZW50OwotICAgIHdoaWxlIChlbGVtZW50KSB7Ci0gICAgICAgIHggKz0gZWxl
bWVudC5vZmZzZXRMZWZ0ICB8fCAwOwotICAgICAgICB5ICs9IGVsZW1lbnQub2Zmc2V0VG9wIHx8
IDA7Ci0gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKLSAgICAgICAgaWYg
KGVsZW1lbnQgPT09IGFuY2VzdG9yRWxlbWVudCkKLSAgICAgICAgICAgIHJldHVybiB7eDogeCwg
eTogeX07Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFW
aWV3fE5vZGV9IHBhcmVudAotICogQHBhcmFtIHs/Vmlld3xOb2RlPX0gYmVmb3JlCi0gKi8KLVZp
ZXcucHJvdG90eXBlLmF0dGFjaFRvID0gZnVuY3Rpb24ocGFyZW50LCBiZWZvcmUpIHsKLSAgICBp
ZiAocGFyZW50IGluc3RhbmNlb2YgVmlldykKLSAgICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoVG8o
cGFyZW50LmVsZW1lbnQsIGJlZm9yZSk7Ci0gICAgaWYgKHR5cGVvZiBiZWZvcmUgPT09ICJ1bmRl
ZmluZWQiKQotICAgICAgICBiZWZvcmUgPSBudWxsOwotICAgIGlmIChiZWZvcmUgaW5zdGFuY2Vv
ZiBWaWV3KQotICAgICAgICBiZWZvcmUgPSBiZWZvcmUuZWxlbWVudDsKLSAgICBwYXJlbnQuaW5z
ZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgYmVmb3JlKTsKLX07Ci0KLVZpZXcucHJvdG90eXBlLmJp
bmRDYWxsYmFja01ldGhvZHMgPSBmdW5jdGlvbigpIHsKLSAgICBmb3IgKHZhciBtZXRob2ROYW1l
IGluIHRoaXMpIHsKLSAgICAgICAgaWYgKCEvXm9uW0EtWl0vLnRlc3QobWV0aG9kTmFtZSkpCi0g
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkobWV0
aG9kTmFtZSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgdmFyIG1ldGhvZCA9IHRo
aXNbbWV0aG9kTmFtZV07Ci0gICAgICAgIGlmICghKG1ldGhvZCBpbnN0YW5jZW9mIEZ1bmN0aW9u
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB0aGlzW21ldGhvZE5hbWVdID0gbWV0
aG9kLmJpbmQodGhpcyk7Ci0gICAgfQotfTsKLQotLyoqCi0gKiBAY29uc3RydWN0b3IKLSAqIEBl
eHRlbmRzIFZpZXcKLSAqLwotZnVuY3Rpb24gU2Nyb2xsVmlldygpIHsKLSAgICBWaWV3LmNhbGwo
dGhpcywgY3JlYXRlRWxlbWVudCgiZGl2IiwgU2Nyb2xsVmlldy5DbGFzc05hbWVTY3JvbGxWaWV3
KSk7Ci0gICAgLyoqCi0gICAgICogQHR5cGUge0VsZW1lbnR9Ci0gICAgICogQGNvbnN0Ci0gICAg
ICovCi0gICAgdGhpcy5jb250ZW50RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoImRpdiIsIFNjcm9s
bFZpZXcuQ2xhc3NOYW1lU2Nyb2xsVmlld0NvbnRlbnQpOwotICAgIHRoaXMuZWxlbWVudC5hcHBl
bmRDaGlsZCh0aGlzLmNvbnRlbnRFbGVtZW50KTsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7bnVt
YmVyfQotICAgICAqLwotICAgIHRoaXMubWluaW11bUNvbnRlbnRPZmZzZXQgPSAtSW5maW5pdHk7
Ci0gICAgLyoqCi0gICAgICogQHR5cGUge251bWJlcn0KLSAgICAgKi8KLSAgICB0aGlzLm1heGlt
dW1Db250ZW50T2Zmc2V0ID0gSW5maW5pdHk7Ci0gICAgLyoqCi0gICAgICogQHR5cGUge251bWJl
cn0KLSAgICAgKiBAcHJvdGVjdGVkCi0gICAgICovCi0gICAgdGhpcy5fY29udGVudE9mZnNldCA9
IDA7Ci0gICAgLyoqCi0gICAgICogQHR5cGUge251bWJlcn0KLSAgICAgKiBAcHJvdGVjdGVkCi0g
ICAgICovCi0gICAgdGhpcy5fd2lkdGggPSAwOwotICAgIC8qKgotICAgICAqIEB0eXBlIHtudW1i
ZXJ9Ci0gICAgICogQHByb3RlY3RlZAotICAgICAqLwotICAgIHRoaXMuX2hlaWdodCA9IDA7Ci0g
ICAgLyoqCi0gICAgICogQHR5cGUge0FuaW1hdG9yfQotICAgICAqIEBwcm90ZWN0ZWQKLSAgICAg
Ki8KLSAgICB0aGlzLl9zY3JvbGxBbmltYXRvciA9IG51bGw7Ci0gICAgLyoqCi0gICAgICogQHR5
cGUgez9PYmplY3R9Ci0gICAgICovCi0gICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7Ci0gICAgLyoq
Ci0gICAgICogQHR5cGUgeyFudW1iZXJ9Ci0gICAgICovCi0gICAgdGhpcy5fbGFzdFRvdWNoUG9z
aXRpb24gPSAwOwotICAgIC8qKgotICAgICAqIEB0eXBlIHshbnVtYmVyfQotICAgICAqLwotICAg
IHRoaXMuX2xhc3RUb3VjaFZlbG9jaXR5ID0gMDsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IW51
bWJlcn0KLSAgICAgKi8KLSAgICB0aGlzLl9sYXN0VG91Y2hUaW1lU3RhbXAgPSAwOwotCi0gICAg
dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNld2hlZWwiLCB0aGlzLm9uTW91c2VX
aGVlbCwgZmFsc2UpOwotICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0
YXJ0IiwgdGhpcy5vblRvdWNoU3RhcnQsIGZhbHNlKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBj
b250ZW50IG9mZnNldCBpcyBwYXJ0aXRpb25lZCBzbyB0aGUgaXQgY2FuIGdvIGJleW9uZCB0aGUg
Q1NTIGxpbWl0Ci0gICAgICogb2YgMzM1NTQ0MzNweC4KLSAgICAgKiBAdHlwZSB7bnVtYmVyfQot
ICAgICAqIEBwcm90ZWN0ZWQKLSAgICAgKi8KLSAgICB0aGlzLl9wYXJ0aXRpb25OdW1iZXIgPSAw
OwotfQotCi1TY3JvbGxWaWV3LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVmlldy5wcm90b3R5
cGUpOwotCi1TY3JvbGxWaWV3LlBhcnRpdGlvbkhlaWdodCA9IDEwMDAwMDsKLVNjcm9sbFZpZXcu
Q2xhc3NOYW1lU2Nyb2xsVmlldyA9ICJzY3JvbGwtdmlldyI7Ci1TY3JvbGxWaWV3LkNsYXNzTmFt
ZVNjcm9sbFZpZXdDb250ZW50ID0gInNjcm9sbC12aWV3LWNvbnRlbnQiOwotCi0vKioKLSAqIEBw
YXJhbSB7IUV2ZW50fSBldmVudAotICovCi1TY3JvbGxWaWV3LnByb3RvdHlwZS5vblRvdWNoU3Rh
cnQgPSBmdW5jdGlvbihldmVudCkgewotICAgIHZhciB0b3VjaCA9IGV2ZW50LnRvdWNoZXNbMF07
Ci0gICAgdGhpcy5fbGFzdFRvdWNoUG9zaXRpb24gPSB0b3VjaC5jbGllbnRZOwotICAgIHRoaXMu
X2xhc3RUb3VjaFZlbG9jaXR5ID0gMDsKLSAgICB0aGlzLl9sYXN0VG91Y2hUaW1lU3RhbXAgPSBl
dmVudC50aW1lU3RhbXA7Ci0gICAgaWYgKHRoaXMuX3Njcm9sbEFuaW1hdG9yKQotICAgICAgICB0
aGlzLl9zY3JvbGxBbmltYXRvci5zdG9wKCk7Ci0gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIo
InRvdWNobW92ZSIsIHRoaXMub25XaW5kb3dUb3VjaE1vdmUsIGZhbHNlKTsKLSAgICB3aW5kb3cu
YWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLm9uV2luZG93VG91Y2hFbmQsIGZhbHNl
KTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshRXZlbnR9IGV2ZW50Ci0gKi8KLVNjcm9sbFZpZXcu
cHJvdG90eXBlLm9uV2luZG93VG91Y2hNb3ZlID0gZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB2YXIg
dG91Y2ggPSBldmVudC50b3VjaGVzWzBdOwotICAgIHZhciBkZWx0YVRpbWUgPSBldmVudC50aW1l
U3RhbXAgLSB0aGlzLl9sYXN0VG91Y2hUaW1lU3RhbXA7Ci0gICAgdmFyIGRlbHRhWSA9IHRoaXMu
X2xhc3RUb3VjaFBvc2l0aW9uIC0gdG91Y2guY2xpZW50WTsKLSAgICB0aGlzLnNjcm9sbEJ5KGRl
bHRhWSwgZmFsc2UpOwotICAgIHRoaXMuX2xhc3RUb3VjaFZlbG9jaXR5ID0gZGVsdGFZIC8gZGVs
dGFUaW1lOwotICAgIHRoaXMuX2xhc3RUb3VjaFBvc2l0aW9uID0gdG91Y2guY2xpZW50WTsKLSAg
ICB0aGlzLl9sYXN0VG91Y2hUaW1lU3RhbXAgPSBldmVudC50aW1lU3RhbXA7Ci0gICAgZXZlbnQu
c3RvcFByb3BhZ2F0aW9uKCk7Ci0gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLX07Ci0KLS8q
KgotICogQHBhcmFtIHshRXZlbnR9IGV2ZW50Ci0gKi8KLVNjcm9sbFZpZXcucHJvdG90eXBlLm9u
V2luZG93VG91Y2hFbmQgPSBmdW5jdGlvbihldmVudCkgewotICAgIGlmIChNYXRoLmFicyh0aGlz
Ll9sYXN0VG91Y2hWZWxvY2l0eSkgPiAwLjAxKSB7Ci0gICAgICAgIHRoaXMuX3Njcm9sbEFuaW1h
dG9yID0gbmV3IEZsaW5nR2VzdHVyZUFuaW1hdG9yKHRoaXMuX2xhc3RUb3VjaFZlbG9jaXR5LCB0
aGlzLl9jb250ZW50T2Zmc2V0KTsKLSAgICAgICAgdGhpcy5fc2Nyb2xsQW5pbWF0b3Iuc3RlcCA9
IHRoaXMub25GbGluZ0dlc3R1cmVBbmltYXRvclN0ZXA7Ci0gICAgICAgIHRoaXMuX3Njcm9sbEFu
aW1hdG9yLnN0YXJ0KCk7Ci0gICAgfQotICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0
b3VjaG1vdmUiLCB0aGlzLm9uV2luZG93VG91Y2hNb3ZlLCBmYWxzZSk7Ci0gICAgd2luZG93LnJl
bW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vbldpbmRvd1RvdWNoRW5kLCBmYWxz
ZSk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IUFuaW1hdG9yfSBhbmltYXRvcgotICovCi1TY3Jv
bGxWaWV3LnByb3RvdHlwZS5vbkZsaW5nR2VzdHVyZUFuaW1hdG9yU3RlcCA9IGZ1bmN0aW9uKGFu
aW1hdG9yKSB7Ci0gICAgdGhpcy5zY3JvbGxUbyhhbmltYXRvci5jdXJyZW50VmFsdWUsIGZhbHNl
KTsKLX07Ci0KLS8qKgotICogQHJldHVybiB7IUFuaW1hdG9yfQotICovCi1TY3JvbGxWaWV3LnBy
b3RvdHlwZS5zY3JvbGxBbmltYXRvciA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLl9z
Y3JvbGxBbmltYXRvcjsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSB3aWR0aAotICov
Ci1TY3JvbGxWaWV3LnByb3RvdHlwZS5zZXRXaWR0aCA9IGZ1bmN0aW9uKHdpZHRoKSB7Ci0gICAg
Y29uc29sZS5hc3NlcnQoaXNGaW5pdGUod2lkdGgpKTsKLSAgICBpZiAodGhpcy5fd2lkdGggPT09
IHdpZHRoKQotICAgICAgICByZXR1cm47Ci0gICAgdGhpcy5fd2lkdGggPSB3aWR0aDsKLSAgICB0
aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLl93aWR0aCArICJweCI7Ci19OwotCi0vKioK
LSAqIEByZXR1cm4geyFudW1iZXJ9Ci0gKi8KLVNjcm9sbFZpZXcucHJvdG90eXBlLndpZHRoID0g
ZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuX3dpZHRoOwotfTsKLQotLyoqCi0gKiBAcGFy
YW0geyFudW1iZXJ9IGhlaWdodAotICovCi1TY3JvbGxWaWV3LnByb3RvdHlwZS5zZXRIZWlnaHQg
PSBmdW5jdGlvbihoZWlnaHQpIHsKLSAgICBjb25zb2xlLmFzc2VydChpc0Zpbml0ZShoZWlnaHQp
KTsKLSAgICBpZiAodGhpcy5faGVpZ2h0ID09PSBoZWlnaHQpCi0gICAgICAgIHJldHVybjsKLSAg
ICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9
IGhlaWdodCArICJweCI7Ci0gICAgaWYgKHRoaXMuZGVsZWdhdGUpCi0gICAgICAgIHRoaXMuZGVs
ZWdhdGUuc2Nyb2xsVmlld0RpZENoYW5nZUhlaWdodCh0aGlzKTsKLX07Ci0KLS8qKgotICogQHJl
dHVybiB7IW51bWJlcn0KLSAqLwotU2Nyb2xsVmlldy5wcm90b3R5cGUuaGVpZ2h0ID0gZnVuY3Rp
b24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuX2hlaWdodDsKLX07Ci0KLS8qKgotICogQHBhcmFtIHsh
QW5pbWF0b3J9IGFuaW1hdG9yCi0gKi8KLVNjcm9sbFZpZXcucHJvdG90eXBlLm9uU2Nyb2xsQW5p
bWF0b3JTdGVwID0gZnVuY3Rpb24oYW5pbWF0b3IpIHsKLSAgICB0aGlzLnNldENvbnRlbnRPZmZz
ZXQoYW5pbWF0b3IuY3VycmVudFZhbHVlKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVy
fSBvZmZzZXQKLSAqIEBwYXJhbSB7P2Jvb2xlYW59IGFuaW1hdGUKLSAqLwotU2Nyb2xsVmlldy5w
cm90b3R5cGUuc2Nyb2xsVG8gPSBmdW5jdGlvbihvZmZzZXQsIGFuaW1hdGUpIHsKLSAgICBjb25z
b2xlLmFzc2VydChpc0Zpbml0ZShvZmZzZXQpKTsKLSAgICBpZiAoIWFuaW1hdGUpIHsKLSAgICAg
ICAgdGhpcy5zZXRDb250ZW50T2Zmc2V0KG9mZnNldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0gICAgaWYgKHRoaXMuX3Njcm9sbEFuaW1hdG9yKQotICAgICAgICB0aGlzLl9zY3JvbGxBbmlt
YXRvci5zdG9wKCk7Ci0gICAgdGhpcy5fc2Nyb2xsQW5pbWF0b3IgPSBuZXcgVHJhbnNpdGlvbkFu
aW1hdG9yKCk7Ci0gICAgdGhpcy5fc2Nyb2xsQW5pbWF0b3Iuc3RlcCA9IHRoaXMub25TY3JvbGxB
bmltYXRvclN0ZXA7Ci0gICAgdGhpcy5fc2Nyb2xsQW5pbWF0b3Iuc2V0RnJvbSh0aGlzLl9jb250
ZW50T2Zmc2V0KTsKLSAgICB0aGlzLl9zY3JvbGxBbmltYXRvci5zZXRUbyhvZmZzZXQpOwotICAg
IHRoaXMuX3Njcm9sbEFuaW1hdG9yLmR1cmF0aW9uID0gMzAwOwotICAgIHRoaXMuX3Njcm9sbEFu
aW1hdG9yLnN0YXJ0KCk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gb2Zmc2V0Ci0g
KiBAcGFyYW0gez9ib29sZWFufSBhbmltYXRlCi0gKi8KLVNjcm9sbFZpZXcucHJvdG90eXBlLnNj
cm9sbEJ5ID0gZnVuY3Rpb24ob2Zmc2V0LCBhbmltYXRlKSB7Ci0gICAgdGhpcy5zY3JvbGxUbyh0
aGlzLl9jb250ZW50T2Zmc2V0ICsgb2Zmc2V0LCBhbmltYXRlKTsKLX07Ci0KLS8qKgotICogQHJl
dHVybiB7IW51bWJlcn0KLSAqLwotU2Nyb2xsVmlldy5wcm90b3R5cGUuY29udGVudE9mZnNldCA9
IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLl9jb250ZW50T2Zmc2V0OwotfTsKLQotLyoq
Ci0gKiBAcGFyYW0gez9FdmVudH0gZXZlbnQKLSAqLwotU2Nyb2xsVmlldy5wcm90b3R5cGUub25N
b3VzZVdoZWVsID0gZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB0aGlzLnNldENvbnRlbnRPZmZzZXQo
dGhpcy5fY29udGVudE9mZnNldCAtIGV2ZW50LndoZWVsRGVsdGEgLyAzMCk7Ci0gICAgZXZlbnQu
c3RvcFByb3BhZ2F0aW9uKCk7Ci0gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLX07Ci0KLQot
LyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IHZhbHVlCi0gKi8KLVNjcm9sbFZpZXcucHJvdG90eXBl
LnNldENvbnRlbnRPZmZzZXQgPSBmdW5jdGlvbih2YWx1ZSkgewotICAgIGNvbnNvbGUuYXNzZXJ0
KGlzRmluaXRlKHZhbHVlKSk7Ci0gICAgdmFsdWUgPSBNYXRoLm1pbih0aGlzLm1heGltdW1Db250
ZW50T2Zmc2V0IC0gdGhpcy5faGVpZ2h0LCBNYXRoLm1heCh0aGlzLm1pbmltdW1Db250ZW50T2Zm
c2V0LCBNYXRoLmZsb29yKHZhbHVlKSkpOwotICAgIGlmICh0aGlzLl9jb250ZW50T2Zmc2V0ID09
PSB2YWx1ZSkKLSAgICAgICAgcmV0dXJuOwotICAgIHZhciBuZXdQYXJ0aXRpb25OdW1iZXIgPSBN
YXRoLmZsb29yKHZhbHVlIC8gU2Nyb2xsVmlldy5QYXJ0aXRpb25IZWlnaHQpOyAgICAKLSAgICB2
YXIgcGFydGl0aW9uQ2hhbmdlZCA9IHRoaXMuX3BhcnRpdGlvbk51bWJlciAhPT0gbmV3UGFydGl0
aW9uTnVtYmVyOwotICAgIHRoaXMuX3BhcnRpdGlvbk51bWJlciA9IG5ld1BhcnRpdGlvbk51bWJl
cjsKLSAgICB0aGlzLl9jb250ZW50T2Zmc2V0ID0gdmFsdWU7Ci0gICAgdGhpcy5jb250ZW50RWxl
bWVudC5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSAidHJhbnNsYXRlKDAsICIgKyAoLXRoaXMuY29u
dGVudFBvc2l0aW9uRm9yQ29udGVudE9mZnNldCh0aGlzLl9jb250ZW50T2Zmc2V0KSkgKyAicHgp
IjsKLSAgICBpZiAodGhpcy5kZWxlZ2F0ZSkgewotICAgICAgICB0aGlzLmRlbGVnYXRlLnNjcm9s
bFZpZXdEaWRDaGFuZ2VDb250ZW50T2Zmc2V0KHRoaXMpOwotICAgICAgICBpZiAocGFydGl0aW9u
Q2hhbmdlZCkKLSAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuc2Nyb2xsVmlld0RpZENoYW5nZVBh
cnRpdGlvbih0aGlzKTsKLSAgICB9Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gb2Zm
c2V0Ci0gKi8KLVNjcm9sbFZpZXcucHJvdG90eXBlLmNvbnRlbnRQb3NpdGlvbkZvckNvbnRlbnRP
ZmZzZXQgPSBmdW5jdGlvbihvZmZzZXQpIHsKLSAgICByZXR1cm4gb2Zmc2V0IC0gdGhpcy5fcGFy
dGl0aW9uTnVtYmVyICogU2Nyb2xsVmlldy5QYXJ0aXRpb25IZWlnaHQ7Ci19OwotCi0vKioKLSAq
IEBjb25zdHJ1Y3RvcgotICogQGV4dGVuZHMgVmlldwotICovCi1mdW5jdGlvbiBMaXN0Q2VsbCgp
IHsKLSAgICBWaWV3LmNhbGwodGhpcywgY3JlYXRlRWxlbWVudCgiZGl2IiwgTGlzdENlbGwuQ2xh
c3NOYW1lTGlzdENlbGwpKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IW51bWJlcn0K
LSAgICAgKi8KLSAgICB0aGlzLnJvdyA9IE5hTjsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IW51
bWJlcn0KLSAgICAgKi8KLSAgICB0aGlzLl93aWR0aCA9IDA7Ci0gICAgLyoqCi0gICAgICogQHR5
cGUgeyFudW1iZXJ9Ci0gICAgICovCi0gICAgdGhpcy5fcG9zaXRpb24gPSAwOwotfQotCi1MaXN0
Q2VsbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFZpZXcucHJvdG90eXBlKTsKLQotTGlzdENl
bGwuRGVmYXVsdFJlY3ljbGVCaW5MaW1pdCA9IDY0OwotTGlzdENlbGwuQ2xhc3NOYW1lTGlzdENl
bGwgPSAibGlzdC1jZWxsIjsKLUxpc3RDZWxsLkNsYXNzTmFtZUhpZGRlbiA9ICJoaWRkZW4iOwot
Ci0vKioKLSAqIEByZXR1cm4geyFBcnJheX0gQW4gYXJyYXkgdG8ga2VlcCB0aHJvd24gYXdheSBj
ZWxscy4KLSAqLwotTGlzdENlbGwucHJvdG90eXBlLl9yZWN5Y2xlQmluID0gZnVuY3Rpb24oKSB7
Ci0gICAgY29uc29sZS5hc3NlcnQoZmFsc2UsICJOT1QgUkVBQ0hFRDogTGlzdENlbGwucHJvdG90
eXBlLl9yZWN5Y2xlQmluIG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4uIik7Ci0gICAgcmV0dXJuIFtd
OwotfTsKLQotTGlzdENlbGwucHJvdG90eXBlLnRocm93QXdheSA9IGZ1bmN0aW9uKCkgewotICAg
IHRoaXMuaGlkZSgpOwotICAgIHZhciBsaW1pdCA9IHR5cGVvZiB0aGlzLmNvbnN0cnVjdG9yLlJl
Y3ljbGVCaW5MaW1pdCA9PT0gInVuZGVmaW5lZCIgPyBMaXN0Q2VsbC5EZWZhdWx0UmVjeWNsZUJp
bkxpbWl0IDogdGhpcy5jb25zdHJ1Y3Rvci5SZWN5Y2xlQmluTGltaXQ7Ci0gICAgdmFyIHJlY3lj
bGVCaW4gPSB0aGlzLl9yZWN5Y2xlQmluKCk7Ci0gICAgaWYgKHJlY3ljbGVCaW4ubGVuZ3RoIDwg
bGltaXQpCi0gICAgICAgIHJlY3ljbGVCaW4ucHVzaCh0aGlzKTsKLX07Ci0KLUxpc3RDZWxsLnBy
b3RvdHlwZS5zaG93ID0gZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5y
ZW1vdmUoTGlzdENlbGwuQ2xhc3NOYW1lSGlkZGVuKTsKLX07Ci0KLUxpc3RDZWxsLnByb3RvdHlw
ZS5oaWRlID0gZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoTGlz
dENlbGwuQ2xhc3NOYW1lSGlkZGVuKTsKLX07Ci0KLS8qKgotICogQHJldHVybiB7IW51bWJlcn0g
V2lkdGggaW4gcGl4ZWxzLgotICovCi1MaXN0Q2VsbC5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlv
bigpewotICAgIHJldHVybiB0aGlzLl93aWR0aDsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVt
YmVyfSB3aWR0aCBXaWR0aCBpbiBwaXhlbHMuCi0gKi8KLUxpc3RDZWxsLnByb3RvdHlwZS5zZXRX
aWR0aCA9IGZ1bmN0aW9uKHdpZHRoKXsKLSAgICBpZiAodGhpcy5fd2lkdGggPT09IHdpZHRoKQot
ICAgICAgICByZXR1cm47Ci0gICAgdGhpcy5fd2lkdGggPSB3aWR0aDsKLSAgICB0aGlzLmVsZW1l
bnQuc3R5bGUud2lkdGggPSB0aGlzLl93aWR0aCArICJweCI7Ci19OwotCi0vKioKLSAqIEByZXR1
cm4geyFudW1iZXJ9IFBvc2l0aW9uIGluIHBpeGVscy4KLSAqLwotTGlzdENlbGwucHJvdG90eXBl
LnBvc2l0aW9uID0gZnVuY3Rpb24oKXsKLSAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247Ci19Owot
Ci0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0geSBQb3NpdGlvbiBpbiBwaXhlbHMuCi0gKi8KLUxp
c3RDZWxsLnByb3RvdHlwZS5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKHkpIHsKLSAgICBpZiAodGhp
cy5fcG9zaXRpb24gPT09IHkpCi0gICAgICAgIHJldHVybjsKLSAgICB0aGlzLl9wb3NpdGlvbiA9
IHk7Ci0gICAgdGhpcy5lbGVtZW50LnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9ICJ0cmFuc2xhdGUo
MCwgIiArIHRoaXMuX3Bvc2l0aW9uICsgInB4KSI7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IWJv
b2xlYW59IHNlbGVjdGVkCi0gKi8KLUxpc3RDZWxsLnByb3RvdHlwZS5zZXRTZWxlY3RlZCA9IGZ1
bmN0aW9uKHNlbGVjdGVkKSB7Ci0gICAgaWYgKHRoaXMuX3NlbGVjdGVkID09PSBzZWxlY3RlZCkK
LSAgICAgICAgcmV0dXJuOwotICAgIHRoaXMuX3NlbGVjdGVkID0gc2VsZWN0ZWQ7Ci0gICAgaWYg
KHRoaXMuX3NlbGVjdGVkKQotICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgic2Vs
ZWN0ZWQiKTsKLSAgICBlbHNlCi0gICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3Zl
KCJzZWxlY3RlZCIpOwotfTsKLQotLyoqCi0gKiBAY29uc3RydWN0b3IKLSAqIEBleHRlbmRzIFZp
ZXcKLSAqLwotZnVuY3Rpb24gTGlzdFZpZXcoKSB7Ci0gICAgVmlldy5jYWxsKHRoaXMsIGNyZWF0
ZUVsZW1lbnQoImRpdiIsIExpc3RWaWV3LkNsYXNzTmFtZUxpc3RWaWV3KSk7Ci0gICAgdGhpcy5l
bGVtZW50LnRhYkluZGV4ID0gMDsKLQotICAgIC8qKgotICAgICAqIEB0eXBlIHshbnVtYmVyfQot
ICAgICAqIEBwcml2YXRlCi0gICAgICovCi0gICAgdGhpcy5fd2lkdGggPSAwOwotICAgIC8qKgot
ICAgICAqIEB0eXBlIHshT2JqZWN0fQotICAgICAqIEBwcml2YXRlCi0gICAgICovCi0gICAgdGhp
cy5fY2VsbHMgPSB7fTsKLQotICAgIC8qKgotICAgICAqIEB0eXBlIHshbnVtYmVyfQotICAgICAq
LwotICAgIHRoaXMuc2VsZWN0ZWRSb3cgPSBMaXN0Vmlldy5Ob1NlbGVjdGlvbjsKLQotICAgIC8q
KgotICAgICAqIEB0eXBlIHshU2Nyb2xsVmlld30KLSAgICAgKi8KLSAgICB0aGlzLnNjcm9sbFZp
ZXcgPSBuZXcgU2Nyb2xsVmlldygpOwotICAgIHRoaXMuc2Nyb2xsVmlldy5kZWxlZ2F0ZSA9IHRo
aXM7Ci0gICAgdGhpcy5zY3JvbGxWaWV3Lm1pbmltdW1Db250ZW50T2Zmc2V0ID0gMDsKLSAgICB0
aGlzLnNjcm9sbFZpZXcuc2V0V2lkdGgoMCk7Ci0gICAgdGhpcy5zY3JvbGxWaWV3LnNldEhlaWdo
dCgwKTsKLSAgICB0aGlzLnNjcm9sbFZpZXcuYXR0YWNoVG8odGhpcyk7Ci0KLSAgICB0aGlzLmVs
ZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLm9uQ2xpY2ssIGZhbHNlKTsKLQot
ICAgIC8qKgotICAgICAqIEB0eXBlIHshYm9vbGVhbn0KLSAgICAgKiBAcHJpdmF0ZQotICAgICAq
LwotICAgIHRoaXMuX25lZWRzVXBkYXRlQ2VsbHMgPSBmYWxzZTsKLX0KLQotTGlzdFZpZXcucHJv
dG90eXBlID0gT2JqZWN0LmNyZWF0ZShWaWV3LnByb3RvdHlwZSk7Ci0KLUxpc3RWaWV3Lk5vU2Vs
ZWN0aW9uID0gLTE7Ci1MaXN0Vmlldy5DbGFzc05hbWVMaXN0VmlldyA9ICJsaXN0LXZpZXciOwot
Ci1MaXN0Vmlldy5wcm90b3R5cGUub25BbmltYXRpb25GcmFtZVdpbGxGaW5pc2ggPSBmdW5jdGlv
bigpIHsKLSAgICBpZiAodGhpcy5fbmVlZHNVcGRhdGVDZWxscykKLSAgICAgICAgdGhpcy51cGRh
dGVDZWxscygpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFib29sZWFufSBuZWVkc1VwZGF0ZUNl
bGxzCi0gKi8KLUxpc3RWaWV3LnByb3RvdHlwZS5zZXROZWVkc1VwZGF0ZUNlbGxzID0gZnVuY3Rp
b24obmVlZHNVcGRhdGVDZWxscykgewotICAgIGlmICh0aGlzLl9uZWVkc1VwZGF0ZUNlbGxzID09
PSBuZWVkc1VwZGF0ZUNlbGxzKQotICAgICAgICByZXR1cm47Ci0gICAgdGhpcy5fbmVlZHNVcGRh
dGVDZWxscyA9IG5lZWRzVXBkYXRlQ2VsbHM7Ci0gICAgaWYgKHRoaXMuX25lZWRzVXBkYXRlQ2Vs
bHMpCi0gICAgICAgIEFuaW1hdGlvbk1hbmFnZXIuc2hhcmVkLm9uKEFuaW1hdGlvbk1hbmFnZXIu
RXZlbnRUeXBlQW5pbWF0aW9uRnJhbWVXaWxsRmluaXNoLCB0aGlzLm9uQW5pbWF0aW9uRnJhbWVX
aWxsRmluaXNoKTsKLSAgICBlbHNlCi0gICAgICAgIEFuaW1hdGlvbk1hbmFnZXIuc2hhcmVkLnJl
bW92ZUxpc3RlbmVyKEFuaW1hdGlvbk1hbmFnZXIuRXZlbnRUeXBlQW5pbWF0aW9uRnJhbWVXaWxs
RmluaXNoLCB0aGlzLm9uQW5pbWF0aW9uRnJhbWVXaWxsRmluaXNoKTsKLX07Ci0KLS8qKgotICog
QHBhcmFtIHshbnVtYmVyfSByb3cKLSAqIEByZXR1cm4gez9MaXN0Q2VsbH0KLSAqLwotTGlzdFZp
ZXcucHJvdG90eXBlLmNlbGxBdFJvdyA9IGZ1bmN0aW9uKHJvdykgewotICAgIHJldHVybiB0aGlz
Ll9jZWxsc1tyb3ddOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IG9mZnNldCBTY3Jv
bGwgb2Zmc2V0IGluIHBpeGVscy4KLSAqIEByZXR1cm4geyFudW1iZXJ9Ci0gKi8KLUxpc3RWaWV3
LnByb3RvdHlwZS5yb3dBdFNjcm9sbE9mZnNldCA9IGZ1bmN0aW9uKG9mZnNldCkgewotICAgIGNv
bnNvbGUuYXNzZXJ0KGZhbHNlLCAiTk9UIFJFQUNIRUQ6IExpc3RWaWV3LnByb3RvdHlwZS5yb3dB
dFNjcm9sbE9mZnNldCBuZWVkcyB0byBiZSBvdmVycmlkZGVuLiIpOwotICAgIHJldHVybiAwOwot
fTsKLQotLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IHJvdwotICogQHJldHVybiB7IW51bWJlcn0g
U2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuCi0gKi8KLUxpc3RWaWV3LnByb3RvdHlwZS5zY3JvbGxP
ZmZzZXRGb3JSb3cgPSBmdW5jdGlvbihyb3cpIHsKLSAgICBjb25zb2xlLmFzc2VydChmYWxzZSwg
Ik5PVCBSRUFDSEVEOiBMaXN0Vmlldy5wcm90b3R5cGUuc2Nyb2xsT2Zmc2V0Rm9yUm93IG5lZWRz
IHRvIGJlIG92ZXJyaWRkZW4uIik7Ci0gICAgcmV0dXJuIDA7Ci19OwotCi0vKioKLSAqIEBwYXJh
bSB7IW51bWJlcn0gcm93Ci0gKiBAcmV0dXJuIHshTGlzdENlbGx9Ci0gKi8KLUxpc3RWaWV3LnBy
b3RvdHlwZS5hZGRDZWxsSWZOZWNlc3NhcnkgPSBmdW5jdGlvbihyb3cpIHsKLSAgICB2YXIgY2Vs
bCA9IHRoaXMuX2NlbGxzW3Jvd107Ci0gICAgaWYgKGNlbGwpCi0gICAgICAgIHJldHVybiBjZWxs
OwotICAgIGNlbGwgPSB0aGlzLnByZXBhcmVOZXdDZWxsKHJvdyk7Ci0gICAgY2VsbC5hdHRhY2hU
byh0aGlzLnNjcm9sbFZpZXcuY29udGVudEVsZW1lbnQpOwotICAgIGNlbGwuc2V0V2lkdGgodGhp
cy5fd2lkdGgpOwotICAgIGNlbGwuc2V0UG9zaXRpb24odGhpcy5zY3JvbGxWaWV3LmNvbnRlbnRQ
b3NpdGlvbkZvckNvbnRlbnRPZmZzZXQodGhpcy5zY3JvbGxPZmZzZXRGb3JSb3cocm93KSkpOwot
ICAgIHRoaXMuX2NlbGxzW3Jvd10gPSBjZWxsOwotICAgIHJldHVybiBjZWxsOwotfTsKLQotLyoq
Ci0gKiBAcGFyYW0geyFudW1iZXJ9IHJvdwotICogQHJldHVybiB7IUxpc3RDZWxsfQotICovCi1M
aXN0Vmlldy5wcm90b3R5cGUucHJlcGFyZU5ld0NlbGwgPSBmdW5jdGlvbihyb3cpIHsKLSAgICBj
b25zb2xlLmFzc2VydChmYWxzZSwgIk5PVCBSRUFDSEVEOiBMaXN0Vmlldy5wcm90b3R5cGUucHJl
cGFyZU5ld0NlbGwgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIik7Ci0gICAgcmV0dXJuIG5ldyBMaXN0
Q2VsbCgpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFMaXN0Q2VsbH0gY2VsbAotICovCi1MaXN0
Vmlldy5wcm90b3R5cGUudGhyb3dBd2F5Q2VsbCA9IGZ1bmN0aW9uKGNlbGwpIHsKLSAgICBkZWxl
dGUgdGhpcy5fY2VsbHNbY2VsbC5yb3ddOwotICAgIGNlbGwudGhyb3dBd2F5KCk7Ci19OwotCi0v
KioKLSAqIEByZXR1cm4geyFudW1iZXJ9Ci0gKi8KLUxpc3RWaWV3LnByb3RvdHlwZS5maXJzdFZp
c2libGVSb3cgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5yb3dBdFNjcm9sbE9mZnNl
dCh0aGlzLnNjcm9sbFZpZXcuY29udGVudE9mZnNldCgpKTsKLX07Ci0KLS8qKgotICogQHJldHVy
biB7IW51bWJlcn0KLSAqLwotTGlzdFZpZXcucHJvdG90eXBlLmxhc3RWaXNpYmxlUm93ID0gZnVu
Y3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMucm93QXRTY3JvbGxPZmZzZXQodGhpcy5zY3JvbGxW
aWV3LmNvbnRlbnRPZmZzZXQoKSArIHRoaXMuc2Nyb2xsVmlldy5oZWlnaHQoKSAtIDEpOwotfTsK
LQotLyoqCi0gKiBAcGFyYW0geyFTY3JvbGxWaWV3fSBzY3JvbGxWaWV3Ci0gKi8KLUxpc3RWaWV3
LnByb3RvdHlwZS5zY3JvbGxWaWV3RGlkQ2hhbmdlQ29udGVudE9mZnNldCA9IGZ1bmN0aW9uKHNj
cm9sbFZpZXcpIHsKLSAgICB0aGlzLnNldE5lZWRzVXBkYXRlQ2VsbHModHJ1ZSk7Ci19OwotCi0v
KioKLSAqIEBwYXJhbSB7IVNjcm9sbFZpZXd9IHNjcm9sbFZpZXcKLSAqLwotTGlzdFZpZXcucHJv
dG90eXBlLnNjcm9sbFZpZXdEaWRDaGFuZ2VIZWlnaHQgPSBmdW5jdGlvbihzY3JvbGxWaWV3KSB7
Ci0gICAgdGhpcy5zZXROZWVkc1VwZGF0ZUNlbGxzKHRydWUpOwotfTsKLQotLyoqCi0gKiBAcGFy
YW0geyFTY3JvbGxWaWV3fSBzY3JvbGxWaWV3Ci0gKi8KLUxpc3RWaWV3LnByb3RvdHlwZS5zY3Jv
bGxWaWV3RGlkQ2hhbmdlUGFydGl0aW9uID0gZnVuY3Rpb24oc2Nyb2xsVmlldykgewotICAgIHRo
aXMuc2V0TmVlZHNVcGRhdGVDZWxscyh0cnVlKTsKLX07Ci0KLUxpc3RWaWV3LnByb3RvdHlwZS51
cGRhdGVDZWxscyA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBmaXJzdFZpc2libGVSb3cgPSB0aGlz
LmZpcnN0VmlzaWJsZVJvdygpOwotICAgIHZhciBsYXN0VmlzaWJsZVJvdyA9IHRoaXMubGFzdFZp
c2libGVSb3coKTsKLSAgICBjb25zb2xlLmFzc2VydChmaXJzdFZpc2libGVSb3cgPD0gbGFzdFZp
c2libGVSb3cpOwotICAgIGZvciAodmFyIGMgaW4gdGhpcy5fY2VsbHMpIHsKLSAgICAgICAgdmFy
IGNlbGwgPSB0aGlzLl9jZWxsc1tjXTsKLSAgICAgICAgaWYgKGNlbGwucm93IDwgZmlyc3RWaXNp
YmxlUm93IHx8IGNlbGwucm93ID4gbGFzdFZpc2libGVSb3cpCi0gICAgICAgICAgICB0aGlzLnRo
cm93QXdheUNlbGwoY2VsbCk7Ci0gICAgfQotICAgIGZvciAodmFyIGkgPSBmaXJzdFZpc2libGVS
b3c7IGkgPD0gbGFzdFZpc2libGVSb3c7ICsraSkgewotICAgICAgICB2YXIgY2VsbCA9IHRoaXMu
X2NlbGxzW2ldOwotICAgICAgICBpZiAoY2VsbCkKLSAgICAgICAgICAgIGNlbGwuc2V0UG9zaXRp
b24odGhpcy5zY3JvbGxWaWV3LmNvbnRlbnRQb3NpdGlvbkZvckNvbnRlbnRPZmZzZXQodGhpcy5z
Y3JvbGxPZmZzZXRGb3JSb3coY2VsbC5yb3cpKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IHRoaXMuYWRkQ2VsbElmTmVjZXNzYXJ5KGkpOwotICAgIH0KLSAgICB0aGlzLnNldE5lZWRzVXBk
YXRlQ2VsbHMoZmFsc2UpOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshbnVtYmVyfSBXaWR0aCBp
biBwaXhlbHMuCi0gKi8KLUxpc3RWaWV3LnByb3RvdHlwZS53aWR0aCA9IGZ1bmN0aW9uKCkgewot
ICAgIHJldHVybiB0aGlzLl93aWR0aDsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSB3
aWR0aCBXaWR0aCBpbiBwaXhlbHMuCi0gKi8KLUxpc3RWaWV3LnByb3RvdHlwZS5zZXRXaWR0aCA9
IGZ1bmN0aW9uKHdpZHRoKSB7Ci0gICAgaWYgKHRoaXMuX3dpZHRoID09PSB3aWR0aCkKLSAgICAg
ICAgcmV0dXJuOwotICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7Ci0gICAgdGhpcy5zY3JvbGxWaWV3
LnNldFdpZHRoKHRoaXMuX3dpZHRoKTsKLSAgICBmb3IgKHZhciBjIGluIHRoaXMuX2NlbGxzKSB7
Ci0gICAgICAgIHRoaXMuX2NlbGxzW2NdLnNldFdpZHRoKHRoaXMuX3dpZHRoKTsKLSAgICB9Ci0g
ICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy5fd2lkdGggKyAicHgiOwotICAgIHRo
aXMuc2V0TmVlZHNVcGRhdGVDZWxscyh0cnVlKTsKLX07Ci0KLS8qKgotICogQHJldHVybiB7IW51
bWJlcn0gSGVpZ2h0IGluIHBpeGVscy4KLSAqLwotTGlzdFZpZXcucHJvdG90eXBlLmhlaWdodCA9
IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLnNjcm9sbFZpZXcuaGVpZ2h0KCk7Ci19Owot
Ci0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gaGVpZ2h0IEhlaWdodCBpbiBwaXhlbHMuCi0gKi8K
LUxpc3RWaWV3LnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbihoZWlnaHQpIHsKLSAgICB0
aGlzLnNjcm9sbFZpZXcuc2V0SGVpZ2h0KGhlaWdodCk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7
P0V2ZW50fSBldmVudAotICovCi1MaXN0Vmlldy5wcm90b3R5cGUub25DbGljayA9IGZ1bmN0aW9u
KGV2ZW50KSB7Ci0gICAgdmFyIGNsaWNrZWRDZWxsRWxlbWVudCA9IGVuY2xvc2luZ05vZGVPclNl
bGZXaXRoQ2xhc3MoZXZlbnQudGFyZ2V0LCBMaXN0Q2VsbC5DbGFzc05hbWVMaXN0Q2VsbCk7Ci0g
ICAgaWYgKCFjbGlja2VkQ2VsbEVsZW1lbnQpCi0gICAgICAgIHJldHVybjsKLSAgICB2YXIgY2xp
Y2tlZENlbGwgPSBjbGlja2VkQ2VsbEVsZW1lbnQuJHZpZXc7Ci0gICAgaWYgKGNsaWNrZWRDZWxs
LnJvdyAhPT0gdGhpcy5zZWxlY3RlZFJvdykKLSAgICAgICAgdGhpcy5zZWxlY3QoY2xpY2tlZENl
bGwucm93KTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSByb3cKLSAqLwotTGlzdFZp
ZXcucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uKHJvdykgewotICAgIGlmICh0aGlzLnNlbGVj
dGVkUm93ID09PSByb3cpCi0gICAgICAgIHJldHVybjsKLSAgICB0aGlzLmRlc2VsZWN0KCk7Ci0g
ICAgaWYgKHJvdyA9PT0gTGlzdFZpZXcuTm9TZWxlY3Rpb24pCi0gICAgICAgIHJldHVybjsKLSAg
ICB0aGlzLnNlbGVjdGVkUm93ID0gcm93OwotICAgIHZhciBzZWxlY3RlZENlbGwgPSB0aGlzLl9j
ZWxsc1t0aGlzLnNlbGVjdGVkUm93XTsKLSAgICBpZiAoc2VsZWN0ZWRDZWxsKQotICAgICAgICBz
ZWxlY3RlZENlbGwuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci19OwotCi1MaXN0Vmlldy5wcm90b3R5cGUu
ZGVzZWxlY3QgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5zZWxlY3RlZFJvdyA9PT0gTGlz
dFZpZXcuTm9TZWxlY3Rpb24pCi0gICAgICAgIHJldHVybjsKLSAgICB2YXIgc2VsZWN0ZWRDZWxs
ID0gdGhpcy5fY2VsbHNbdGhpcy5zZWxlY3RlZFJvd107Ci0gICAgaWYgKHNlbGVjdGVkQ2VsbCkK
LSAgICAgICAgc2VsZWN0ZWRDZWxsLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICB0aGlzLnNlbGVj
dGVkUm93ID0gTGlzdFZpZXcuTm9TZWxlY3Rpb247Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IW51
bWJlcn0gcm93Ci0gKiBAcGFyYW0geyFib29sZWFufSBhbmltYXRlCi0gKi8KLUxpc3RWaWV3LnBy
b3RvdHlwZS5zY3JvbGxUb1JvdyA9IGZ1bmN0aW9uKHJvdywgYW5pbWF0ZSkgewotICAgIHRoaXMu
c2Nyb2xsVmlldy5zY3JvbGxUbyh0aGlzLnNjcm9sbE9mZnNldEZvclJvdyhyb3cpLCBhbmltYXRl
KTsKLX07Ci0KLS8qKgotICogQGNvbnN0cnVjdG9yCi0gKiBAZXh0ZW5kcyBWaWV3Ci0gKiBAcGFy
YW0geyFTY3JvbGxWaWV3fSBzY3JvbGxWaWV3Ci0gKi8KLWZ1bmN0aW9uIFNjcnViYnlTY3JvbGxC
YXIoc2Nyb2xsVmlldykgewotICAgIFZpZXcuY2FsbCh0aGlzLCBjcmVhdGVFbGVtZW50KCJkaXYi
LCBTY3J1YmJ5U2Nyb2xsQmFyLkNsYXNzTmFtZVNjcnViYnlTY3JvbGxCYXIpKTsKLQotICAgIC8q
KgotICAgICAqIEB0eXBlIHshRWxlbWVudH0KLSAgICAgKiBAY29uc3QKLSAgICAgKi8KLSAgICB0
aGlzLnRodW1iID0gY3JlYXRlRWxlbWVudCgiZGl2IiwgU2NydWJieVNjcm9sbEJhci5DbGFzc05h
bWVTY3J1YmJ5U2Nyb2xsVGh1bWIpOwotICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlz
LnRodW1iKTsKLQotICAgIC8qKgotICAgICAqIEB0eXBlIHshU2Nyb2xsVmlld30KLSAgICAgKiBA
Y29uc3QKLSAgICAgKi8KLSAgICB0aGlzLnNjcm9sbFZpZXcgPSBzY3JvbGxWaWV3OwotCi0gICAg
LyoqCi0gICAgICogQHR5cGUgeyFudW1iZXJ9Ci0gICAgICogQHByb3RlY3RlZAotICAgICAqLwot
ICAgIHRoaXMuX2hlaWdodCA9IDA7Ci0gICAgLyoqCi0gICAgICogQHR5cGUgeyFudW1iZXJ9Ci0g
ICAgICogQHByb3RlY3RlZAotICAgICAqLwotICAgIHRoaXMuX3RodW1iSGVpZ2h0ID0gMDsKLSAg
ICAvKioKLSAgICAgKiBAdHlwZSB7IW51bWJlcn0KLSAgICAgKiBAcHJvdGVjdGVkCi0gICAgICov
Ci0gICAgdGhpcy5fdGh1bWJQb3NpdGlvbiA9IDA7Ci0KLSAgICB0aGlzLnNldEhlaWdodCgwKTsK
LSAgICB0aGlzLnNldFRodW1iSGVpZ2h0KFNjcnViYnlTY3JvbGxCYXIuVGh1bWJIZWlnaHQpOwot
Ci0gICAgLyoqCi0gICAgICogQHR5cGUgez9BbmltYXRvcn0KLSAgICAgKiBAcHJvdGVjdGVkCi0g
ICAgICovCi0gICAgdGhpcy5fdGh1bWJTdHlsZVRvcEFuaW1hdG9yID0gbnVsbDsKLQotICAgIC8q
KiAKLSAgICAgKiBAdHlwZSB7P251bWJlcn0KLSAgICAgKiBAcHJvdGVjdGVkCi0gICAgICovCi0g
ICAgdGhpcy5fdGltZXIgPSBudWxsOwotICAgIAotICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExp
c3RlbmVyKCJtb3VzZWRvd24iLCB0aGlzLm9uTW91c2VEb3duLCBmYWxzZSk7Ci0gICAgdGhpcy5l
bGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCB0aGlzLm9uVG91Y2hTdGFydCwg
ZmFsc2UpOwotfQotCi1TY3J1YmJ5U2Nyb2xsQmFyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUo
Vmlldy5wcm90b3R5cGUpOwotCi1TY3J1YmJ5U2Nyb2xsQmFyLlNjcm9sbEludGVydmFsID0gMTY7
Ci1TY3J1YmJ5U2Nyb2xsQmFyLlRodW1iTWFyZ2luID0gMjsKLVNjcnViYnlTY3JvbGxCYXIuVGh1
bWJIZWlnaHQgPSAzMDsKLVNjcnViYnlTY3JvbGxCYXIuQ2xhc3NOYW1lU2NydWJieVNjcm9sbEJh
ciA9ICJzY3J1YmJ5LXNjcm9sbC1iYXIiOwotU2NydWJieVNjcm9sbEJhci5DbGFzc05hbWVTY3J1
YmJ5U2Nyb2xsVGh1bWIgPSAic2NydWJieS1zY3JvbGwtdGh1bWIiOwotCi0vKioKLSAqIEBwYXJh
bSB7P0V2ZW50fSBldmVudAotICovCi1TY3J1YmJ5U2Nyb2xsQmFyLnByb3RvdHlwZS5vblRvdWNo
U3RhcnQgPSBmdW5jdGlvbihldmVudCkgewotICAgIHZhciB0b3VjaCA9IGV2ZW50LnRvdWNoZXNb
MF07Ci0gICAgdGhpcy5fc2V0VGh1bWJQb3NpdGlvbkZyb21FdmVudFBvc2l0aW9uKHRvdWNoLmNs
aWVudFkpOwotICAgIGlmICh0aGlzLl90aHVtYlN0eWxlVG9wQW5pbWF0b3IpCi0gICAgICAgIHRo
aXMuX3RodW1iU3R5bGVUb3BBbmltYXRvci5zdG9wKCk7Ci0gICAgdGhpcy5fdGltZXIgPSBzZXRJ
bnRlcnZhbCh0aGlzLm9uU2Nyb2xsVGltZXIsIFNjcnViYnlTY3JvbGxCYXIuU2Nyb2xsSW50ZXJ2
YWwpOwotICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLCB0aGlzLm9uV2lu
ZG93VG91Y2hNb3ZlLCBmYWxzZSk7Ci0gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNo
ZW5kIiwgdGhpcy5vbldpbmRvd1RvdWNoRW5kLCBmYWxzZSk7Ci0gICAgZXZlbnQuc3RvcFByb3Bh
Z2F0aW9uKCk7Ci0gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLX07Ci0KLS8qKgotICogQHBh
cmFtIHs/RXZlbnR9IGV2ZW50Ci0gKi8KLVNjcnViYnlTY3JvbGxCYXIucHJvdG90eXBlLm9uV2lu
ZG93VG91Y2hNb3ZlID0gZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB2YXIgdG91Y2ggPSBldmVudC50
b3VjaGVzWzBdOwotICAgIHRoaXMuX3NldFRodW1iUG9zaXRpb25Gcm9tRXZlbnRQb3NpdGlvbih0
b3VjaC5jbGllbnRZKTsKLSAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKLSAgICBldmVudC5w
cmV2ZW50RGVmYXVsdCgpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0gez9FdmVudH0gZXZlbnQKLSAq
LwotU2NydWJieVNjcm9sbEJhci5wcm90b3R5cGUub25XaW5kb3dUb3VjaEVuZCA9IGZ1bmN0aW9u
KGV2ZW50KSB7Ci0gICAgdGhpcy5fdGh1bWJTdHlsZVRvcEFuaW1hdG9yID0gbmV3IFRyYW5zaXRp
b25BbmltYXRvcigpOwotICAgIHRoaXMuX3RodW1iU3R5bGVUb3BBbmltYXRvci5zdGVwID0gdGhp
cy5vblRodW1iU3R5bGVUb3BBbmltYXRpb25TdGVwOwotICAgIHRoaXMuX3RodW1iU3R5bGVUb3BB
bmltYXRvci5zZXRGcm9tKHRoaXMudGh1bWIub2Zmc2V0VG9wKTsKLSAgICB0aGlzLl90aHVtYlN0
eWxlVG9wQW5pbWF0b3Iuc2V0VG8oKHRoaXMuX2hlaWdodCAtIHRoaXMuX3RodW1iSGVpZ2h0KSAv
IDIpOwotICAgIHRoaXMuX3RodW1iU3R5bGVUb3BBbmltYXRvci50aW1pbmdGdW5jdGlvbiA9IEFu
aW1hdGlvblRpbWluZ0Z1bmN0aW9uLkVhc2VJbk91dDsKLSAgICB0aGlzLl90aHVtYlN0eWxlVG9w
QW5pbWF0b3IuZHVyYXRpb24gPSAxMDA7Ci0gICAgdGhpcy5fdGh1bWJTdHlsZVRvcEFuaW1hdG9y
LnN0YXJ0KCk7Ci0KLSAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIiwg
dGhpcy5vbldpbmRvd1RvdWNoTW92ZSwgZmFsc2UpOwotICAgIHdpbmRvdy5yZW1vdmVFdmVudExp
c3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25XaW5kb3dUb3VjaEVuZCwgZmFsc2UpOwotICAgIGNs
ZWFySW50ZXJ2YWwodGhpcy5fdGltZXIpOwotfTsKLQotLyoqCi0gKiBAcmV0dXJuIHshbnVtYmVy
fSBIZWlnaHQgb2YgdGhlIHZpZXcgaW4gcGl4ZWxzLgotICovCi1TY3J1YmJ5U2Nyb2xsQmFyLnBy
b3RvdHlwZS5oZWlnaHQgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5faGVpZ2h0Owot
fTsKLQotLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IGhlaWdodCBIZWlnaHQgb2YgdGhlIHZpZXcg
aW4gcGl4ZWxzLgotICovCi1TY3J1YmJ5U2Nyb2xsQmFyLnByb3RvdHlwZS5zZXRIZWlnaHQgPSBm
dW5jdGlvbihoZWlnaHQpIHsKLSAgICBpZiAodGhpcy5faGVpZ2h0ID09PSBoZWlnaHQpCi0gICAg
ICAgIHJldHVybjsKLSAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgdGhpcy5lbGVtZW50
LnN0eWxlLmhlaWdodCA9IHRoaXMuX2hlaWdodCArICJweCI7Ci0gICAgdGhpcy50aHVtYi5zdHls
ZS50b3AgPSAoKHRoaXMuX2hlaWdodCAtIHRoaXMuX3RodW1iSGVpZ2h0KSAvIDIpICsgInB4IjsK
LSAgICB0aGlzLl90aHVtYlBvc2l0aW9uID0gMDsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVt
YmVyfSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBzY3JvbGwgYmFyIHRodW1iIGluIHBpeGVscy4KLSAq
LwotU2NydWJieVNjcm9sbEJhci5wcm90b3R5cGUuc2V0VGh1bWJIZWlnaHQgPSBmdW5jdGlvbiho
ZWlnaHQpIHsKLSAgICBpZiAodGhpcy5fdGh1bWJIZWlnaHQgPT09IGhlaWdodCkKLSAgICAgICAg
cmV0dXJuOwotICAgIHRoaXMuX3RodW1iSGVpZ2h0ID0gaGVpZ2h0OwotICAgIHRoaXMudGh1bWIu
c3R5bGUuaGVpZ2h0ID0gdGhpcy5fdGh1bWJIZWlnaHQgKyAicHgiOwotICAgIHRoaXMudGh1bWIu
c3R5bGUudG9wID0gKCh0aGlzLl9oZWlnaHQgLSB0aGlzLl90aHVtYkhlaWdodCkgLyAyKSArICJw
eCI7Ci0gICAgdGhpcy5fdGh1bWJQb3NpdGlvbiA9IDA7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7
bnVtYmVyfSBwb3NpdGlvbgotICovCi1TY3J1YmJ5U2Nyb2xsQmFyLnByb3RvdHlwZS5fc2V0VGh1
bWJQb3NpdGlvbkZyb21FdmVudFBvc2l0aW9uID0gZnVuY3Rpb24ocG9zaXRpb24pIHsKLSAgICB2
YXIgdGh1bWJNaW4gPSBTY3J1YmJ5U2Nyb2xsQmFyLlRodW1iTWFyZ2luOwotICAgIHZhciB0aHVt
Yk1heCA9IHRoaXMuX2hlaWdodCAtIHRoaXMuX3RodW1iSGVpZ2h0IC0gU2NydWJieVNjcm9sbEJh
ci5UaHVtYk1hcmdpbiAqIDI7Ci0gICAgdmFyIHkgPSBwb3NpdGlvbiAtIHRoaXMuZWxlbWVudC5n
ZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQuY2xpZW50VG9wICsgdGhp
cy5lbGVtZW50LnNjcm9sbFRvcDsKLSAgICB2YXIgdGh1bWJQb3NpdGlvbiA9IHkgLSB0aGlzLl90
aHVtYkhlaWdodCAvIDI7Ci0gICAgdGh1bWJQb3NpdGlvbiA9IE1hdGgubWF4KHRodW1iUG9zaXRp
b24sIHRodW1iTWluKTsKLSAgICB0aHVtYlBvc2l0aW9uID0gTWF0aC5taW4odGh1bWJQb3NpdGlv
biwgdGh1bWJNYXgpOwotICAgIHRoaXMudGh1bWIuc3R5bGUudG9wID0gdGh1bWJQb3NpdGlvbiAr
ICJweCI7Ci0gICAgdGhpcy5fdGh1bWJQb3NpdGlvbiA9IDEuMCAtICh0aHVtYlBvc2l0aW9uIC0g
dGh1bWJNaW4pIC8gKHRodW1iTWF4IC0gdGh1bWJNaW4pICogMjsKLX07Ci0KLS8qKgotICogQHBh
cmFtIHs/RXZlbnR9IGV2ZW50Ci0gKi8KLVNjcnViYnlTY3JvbGxCYXIucHJvdG90eXBlLm9uTW91
c2VEb3duID0gZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB0aGlzLl9zZXRUaHVtYlBvc2l0aW9uRnJv
bUV2ZW50UG9zaXRpb24oZXZlbnQuY2xpZW50WSk7Ci0KLSAgICB3aW5kb3cuYWRkRXZlbnRMaXN0
ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5vbldpbmRvd01vdXNlTW92ZSwgZmFsc2UpOwotICAgIHdp
bmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5vbldpbmRvd01vdXNlVXAsIGZh
bHNlKTsKLSAgICBpZiAodGhpcy5fdGh1bWJTdHlsZVRvcEFuaW1hdG9yKQotICAgICAgICB0aGlz
Ll90aHVtYlN0eWxlVG9wQW5pbWF0b3Iuc3RvcCgpOwotICAgIHRoaXMuX3RpbWVyID0gc2V0SW50
ZXJ2YWwodGhpcy5vblNjcm9sbFRpbWVyLCBTY3J1YmJ5U2Nyb2xsQmFyLlNjcm9sbEludGVydmFs
KTsKLSAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKLSAgICBldmVudC5wcmV2ZW50RGVmYXVs
dCgpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0gez9FdmVudH0gZXZlbnQKLSAqLwotU2NydWJieVNj
cm9sbEJhci5wcm90b3R5cGUub25XaW5kb3dNb3VzZU1vdmUgPSBmdW5jdGlvbihldmVudCkgewot
ICAgIHRoaXMuX3NldFRodW1iUG9zaXRpb25Gcm9tRXZlbnRQb3NpdGlvbihldmVudC5jbGllbnRZ
KTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHs/RXZlbnR9IGV2ZW50Ci0gKi8KLVNjcnViYnlTY3Jv
bGxCYXIucHJvdG90eXBlLm9uV2luZG93TW91c2VVcCA9IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAg
dGhpcy5fdGh1bWJTdHlsZVRvcEFuaW1hdG9yID0gbmV3IFRyYW5zaXRpb25BbmltYXRvcigpOwot
ICAgIHRoaXMuX3RodW1iU3R5bGVUb3BBbmltYXRvci5zdGVwID0gdGhpcy5vblRodW1iU3R5bGVU
b3BBbmltYXRpb25TdGVwOwotICAgIHRoaXMuX3RodW1iU3R5bGVUb3BBbmltYXRvci5zZXRGcm9t
KHRoaXMudGh1bWIub2Zmc2V0VG9wKTsKLSAgICB0aGlzLl90aHVtYlN0eWxlVG9wQW5pbWF0b3Iu
c2V0VG8oKHRoaXMuX2hlaWdodCAtIHRoaXMuX3RodW1iSGVpZ2h0KSAvIDIpOwotICAgIHRoaXMu
X3RodW1iU3R5bGVUb3BBbmltYXRvci50aW1pbmdGdW5jdGlvbiA9IEFuaW1hdGlvblRpbWluZ0Z1
bmN0aW9uLkVhc2VJbk91dDsKLSAgICB0aGlzLl90aHVtYlN0eWxlVG9wQW5pbWF0b3IuZHVyYXRp
b24gPSAxMDA7Ci0gICAgdGhpcy5fdGh1bWJTdHlsZVRvcEFuaW1hdG9yLnN0YXJ0KCk7Ci0gICAg
Ci0gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMub25XaW5k
b3dNb3VzZU1vdmUsIGZhbHNlKTsKLSAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91
c2V1cCIsIHRoaXMub25XaW5kb3dNb3VzZVVwLCBmYWxzZSk7Ci0gICAgY2xlYXJJbnRlcnZhbCh0
aGlzLl90aW1lcik7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IUFuaW1hdG9yfSBhbmltYXRvcgot
ICovCi1TY3J1YmJ5U2Nyb2xsQmFyLnByb3RvdHlwZS5vblRodW1iU3R5bGVUb3BBbmltYXRpb25T
dGVwID0gZnVuY3Rpb24oYW5pbWF0b3IpIHsKLSAgICB0aGlzLnRodW1iLnN0eWxlLnRvcCA9IGFu
aW1hdG9yLmN1cnJlbnRWYWx1ZSArICJweCI7Ci19OwotCi1TY3J1YmJ5U2Nyb2xsQmFyLnByb3Rv
dHlwZS5vblNjcm9sbFRpbWVyID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNjcm9sbEFtb3VudCA9
IE1hdGgucG93KHRoaXMuX3RodW1iUG9zaXRpb24sIDIpICogMTA7Ci0gICAgaWYgKHRoaXMuX3Ro
dW1iUG9zaXRpb24gPiAwKQotICAgICAgICBzY3JvbGxBbW91bnQgPSAtc2Nyb2xsQW1vdW50Owot
ICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxCeShzY3JvbGxBbW91bnQsIGZhbHNlKTsKLX07Ci0K
LS8qKgotICogQGNvbnN0cnVjdG9yCi0gKiBAZXh0ZW5kcyBMaXN0Q2VsbAotICogQHBhcmFtIHsh
QXJyYXl9IHNob3J0TW9udGhMYWJlbHMKLSAqLwotZnVuY3Rpb24gWWVhckxpc3RDZWxsKHNob3J0
TW9udGhMYWJlbHMpIHsKLSAgICBMaXN0Q2VsbC5jYWxsKHRoaXMpOwotICAgIHRoaXMuZWxlbWVu
dC5jbGFzc0xpc3QuYWRkKFllYXJMaXN0Q2VsbC5DbGFzc05hbWVZZWFyTGlzdENlbGwpOwotICAg
IHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBZZWFyTGlzdENlbGwuSGVpZ2h0ICsgInB4IjsK
LQotICAgIC8qKgotICAgICAqIEB0eXBlIHshRWxlbWVudH0KLSAgICAgKiBAY29uc3QKLSAgICAg
Ki8KLSAgICB0aGlzLmxhYmVsID0gY3JlYXRlRWxlbWVudCgiZGl2IiwgWWVhckxpc3RDZWxsLkNs
YXNzTmFtZUxhYmVsLCAiLS0tLSIpOwotICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlz
LmxhYmVsKTsKLSAgICB0aGlzLmxhYmVsLnN0eWxlLmhlaWdodCA9IChZZWFyTGlzdENlbGwuSGVp
Z2h0IC0gWWVhckxpc3RDZWxsLkJvcmRlckJvdHRvbVdpZHRoKSArICJweCI7Ci0gICAgdGhpcy5s
YWJlbC5zdHlsZS5saW5lSGVpZ2h0ID0gKFllYXJMaXN0Q2VsbC5IZWlnaHQgLSBZZWFyTGlzdENl
bGwuQm9yZGVyQm90dG9tV2lkdGgpICsgInB4IjsKLQotICAgIC8qKgotICAgICAqIEB0eXBlIHsh
QXJyYXl9IEFycmF5IG9mIHRoZSAxMiBtb250aCBidXR0b24gZWxlbWVudHMuCi0gICAgICogQGNv
bnN0Ci0gICAgICovCi0gICAgdGhpcy5tb250aEJ1dHRvbnMgPSBbXTsKLSAgICB2YXIgbW9udGhD
aG9vc2VyRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoImRpdiIsIFllYXJMaXN0Q2VsbC5DbGFzc05h
bWVNb250aENob29zZXIpOwotICAgIGZvciAodmFyIHIgPSAwOyByIDwgWWVhckxpc3RDZWxsLkJ1
dHRvblJvd3M7ICsrcikgewotICAgICAgICB2YXIgYnV0dG9uc1JvdyA9IGNyZWF0ZUVsZW1lbnQo
ImRpdiIsIFllYXJMaXN0Q2VsbC5DbGFzc05hbWVNb250aEJ1dHRvbnNSb3cpOwotICAgICAgICBm
b3IgKHZhciBjID0gMDsgYyA8IFllYXJMaXN0Q2VsbC5CdXR0b25Db2x1bW5zOyArK2MpIHsKLSAg
ICAgICAgICAgIHZhciBtb250aCA9IGMgKyByICogWWVhckxpc3RDZWxsLkJ1dHRvbkNvbHVtbnM7
Ci0gICAgICAgICAgICB2YXIgYnV0dG9uID0gY3JlYXRlRWxlbWVudCgiYnV0dG9uIiwgWWVhckxp
c3RDZWxsLkNsYXNzTmFtZU1vbnRoQnV0dG9uLCBzaG9ydE1vbnRoTGFiZWxzW21vbnRoXSk7Ci0g
ICAgICAgICAgICBidXR0b24uZGF0YXNldC5tb250aCA9IG1vbnRoOwotICAgICAgICAgICAgYnV0
dG9uc1Jvdy5hcHBlbmRDaGlsZChidXR0b24pOwotICAgICAgICAgICAgdGhpcy5tb250aEJ1dHRv
bnMucHVzaChidXR0b24pOwotICAgICAgICB9Ci0gICAgICAgIG1vbnRoQ2hvb3NlckVsZW1lbnQu
YXBwZW5kQ2hpbGQoYnV0dG9uc1Jvdyk7Ci0gICAgfQotICAgIHRoaXMuZWxlbWVudC5hcHBlbmRD
aGlsZChtb250aENob29zZXJFbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIEB0eXBlIHshYm9v
bGVhbn0KLSAgICAgKiBAcHJpdmF0ZQotICAgICAqLwotICAgIHRoaXMuX3NlbGVjdGVkID0gZmFs
c2U7Ci0gICAgLyoqCi0gICAgICogQHR5cGUgeyFudW1iZXJ9Ci0gICAgICogQHByaXZhdGUKLSAg
ICAgKi8KLSAgICB0aGlzLl9oZWlnaHQgPSAwOwotfQotCi1ZZWFyTGlzdENlbGwucHJvdG90eXBl
ID0gT2JqZWN0LmNyZWF0ZShMaXN0Q2VsbC5wcm90b3R5cGUpOwotCi1ZZWFyTGlzdENlbGwuSGVp
Z2h0ID0gaGFzSW5hY2N1cmF0ZVBvaW50aW5nRGV2aWNlKCkgPyAzMSA6IDI1OwotWWVhckxpc3RD
ZWxsLkJvcmRlckJvdHRvbVdpZHRoID0gMTsKLVllYXJMaXN0Q2VsbC5CdXR0b25Sb3dzID0gMzsK
LVllYXJMaXN0Q2VsbC5CdXR0b25Db2x1bW5zID0gNDsKLVllYXJMaXN0Q2VsbC5TZWxlY3RlZEhl
aWdodCA9IGhhc0luYWNjdXJhdGVQb2ludGluZ0RldmljZSgpID8gMTI3IDogMTIxOwotWWVhckxp
c3RDZWxsLkNsYXNzTmFtZVllYXJMaXN0Q2VsbCA9ICJ5ZWFyLWxpc3QtY2VsbCI7Ci1ZZWFyTGlz
dENlbGwuQ2xhc3NOYW1lTGFiZWwgPSAibGFiZWwiOwotWWVhckxpc3RDZWxsLkNsYXNzTmFtZU1v
bnRoQ2hvb3NlciA9ICJtb250aC1jaG9vc2VyIjsKLVllYXJMaXN0Q2VsbC5DbGFzc05hbWVNb250
aEJ1dHRvbnNSb3cgPSAibW9udGgtYnV0dG9ucy1yb3ciOwotWWVhckxpc3RDZWxsLkNsYXNzTmFt
ZU1vbnRoQnV0dG9uID0gIm1vbnRoLWJ1dHRvbiI7Ci1ZZWFyTGlzdENlbGwuQ2xhc3NOYW1lSGln
aGxpZ2h0ZWQgPSAiaGlnaGxpZ2h0ZWQiOwotCi1ZZWFyTGlzdENlbGwuX3JlY3ljbGVCaW4gPSBb
XTsKLQotLyoqCi0gKiBAcmV0dXJuIHshQXJyYXl9Ci0gKiBAb3ZlcnJpZGUKLSAqLwotWWVhckxp
c3RDZWxsLnByb3RvdHlwZS5fcmVjeWNsZUJpbiA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBZ
ZWFyTGlzdENlbGwuX3JlY3ljbGVCaW47Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0g
cm93Ci0gKi8KLVllYXJMaXN0Q2VsbC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbihyb3cpIHsK
LSAgICB0aGlzLnJvdyA9IHJvdzsKLSAgICB0aGlzLmxhYmVsLnRleHRDb250ZW50ID0gcm93ICsg
MTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubW9udGhCdXR0b25zLmxlbmd0aDsgKytp
KSB7Ci0gICAgICAgIHRoaXMubW9udGhCdXR0b25zW2ldLmNsYXNzTGlzdC5yZW1vdmUoWWVhckxp
c3RDZWxsLkNsYXNzTmFtZUhpZ2hsaWdodGVkKTsKLSAgICB9Ci0gICAgdGhpcy5zaG93KCk7Ci19
OwotCi0vKioKLSAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBoZWlnaHQgaW4gcGl4ZWxzLgotICov
Ci1ZZWFyTGlzdENlbGwucHJvdG90eXBlLmhlaWdodCA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVy
biB0aGlzLl9oZWlnaHQ7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gaGVpZ2h0IEhl
aWdodCBpbiBwaXhlbHMuCi0gKi8KLVllYXJMaXN0Q2VsbC5wcm90b3R5cGUuc2V0SGVpZ2h0ID0g
ZnVuY3Rpb24oaGVpZ2h0KSB7Ci0gICAgaWYgKHRoaXMuX2hlaWdodCA9PT0gaGVpZ2h0KQotICAg
ICAgICByZXR1cm47Ci0gICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0OwotICAgIHRoaXMuZWxlbWVu
dC5zdHlsZS5oZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyAicHgiOwotfTsKLQotLyoqCi0gKiBAY29u
c3RydWN0b3IKLSAqIEBleHRlbmRzIExpc3RWaWV3Ci0gKiBAcGFyYW0geyFNb250aH0gbWluaW11
bU1vbnRoCi0gKiBAcGFyYW0geyFNb250aH0gbWF4aW11bU1vbnRoCi0gKi8KLWZ1bmN0aW9uIFll
YXJMaXN0VmlldyhtaW5pbXVtTW9udGgsIG1heGltdW1Nb250aCkgewotICAgIExpc3RWaWV3LmNh
bGwodGhpcyk7Ci0gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoInllYXItbGlzdC12aWV3
Iik7Ci0KLSAgICAvKioKLSAgICAgKiBAdHlwZSB7P01vbnRofQotICAgICAqLwotICAgIHRoaXMu
aGlnaGxpZ2h0ZWRNb250aCA9IG51bGw7Ci0gICAgLyoqCi0gICAgICogQHR5cGUgeyFNb250aH0K
LSAgICAgKiBAY29uc3QKLSAgICAgKiBAcHJvdGVjdGVkCi0gICAgICovCi0gICAgdGhpcy5fbWlu
aW11bU1vbnRoID0gbWluaW11bU1vbnRoOwotICAgIC8qKgotICAgICAqIEB0eXBlIHshTW9udGh9
Ci0gICAgICogQGNvbnN0Ci0gICAgICogQHByb3RlY3RlZAotICAgICAqLwotICAgIHRoaXMuX21h
eGltdW1Nb250aCA9IG1heGltdW1Nb250aDsKLQotICAgIHRoaXMuc2Nyb2xsVmlldy5taW5pbXVt
Q29udGVudE9mZnNldCA9ICh0aGlzLl9taW5pbXVtTW9udGgueWVhciAtIDEpICogWWVhckxpc3RD
ZWxsLkhlaWdodDsKLSAgICB0aGlzLnNjcm9sbFZpZXcubWF4aW11bUNvbnRlbnRPZmZzZXQgPSAo
dGhpcy5fbWF4aW11bU1vbnRoLnllYXIgLSAxKSAqIFllYXJMaXN0Q2VsbC5IZWlnaHQgKyBZZWFy
TGlzdENlbGwuU2VsZWN0ZWRIZWlnaHQ7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHR5cGUgeyFP
YmplY3R9Ci0gICAgICogQGNvbnN0Ci0gICAgICogQHByb3RlY3RlZAotICAgICAqLwotICAgIHRo
aXMuX3J1bm5pbmdBbmltYXRvcnMgPSB7fTsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IUFycmF5
fQotICAgICAqIEBjb25zdAotICAgICAqIEBwcm90ZWN0ZWQKLSAgICAgKi8KLSAgICB0aGlzLl9h
bmltYXRpbmdSb3dzID0gW107Ci0gICAgLyoqCi0gICAgICogQHR5cGUgeyFib29sZWFufQotICAg
ICAqIEBwcm90ZWN0ZWQKLSAgICAgKi8KLSAgICB0aGlzLl9pZ25vcmVNb3VzZU91dFVudGlsbE5l
eHRNb3VzZU92ZXIgPSBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IVNjcnVi
YnlTY3JvbGxCYXJ9Ci0gICAgICogQGNvbnN0Ci0gICAgICovCi0gICAgdGhpcy5zY3J1YmJ5U2Ny
b2xsQmFyID0gbmV3IFNjcnViYnlTY3JvbGxCYXIodGhpcy5zY3JvbGxWaWV3KTsKLSAgICB0aGlz
LnNjcnViYnlTY3JvbGxCYXIuYXR0YWNoVG8odGhpcyk7Ci0gICAgCi0gICAgdGhpcy5lbGVtZW50
LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIHRoaXMub25Nb3VzZU92ZXIsIGZhbHNlKTsK
LSAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCB0aGlzLm9uTW91
c2VPdXQsIGZhbHNlKTsKLSAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93
biIsIHRoaXMub25LZXlEb3duLCBmYWxzZSk7Ci0gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlz
dGVuZXIoInRvdWNoc3RhcnQiLCB0aGlzLm9uVG91Y2hTdGFydCwgZmFsc2UpOwotfQotCi1ZZWFy
TGlzdFZpZXcucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMaXN0Vmlldy5wcm90b3R5cGUpOwot
Ci1ZZWFyTGlzdFZpZXcuSGVpZ2h0ID0gWWVhckxpc3RDZWxsLlNlbGVjdGVkSGVpZ2h0IC0gMTsK
LVllYXJMaXN0Vmlldy5FdmVudFR5cGVZZWFyTGlzdFZpZXdEaWRIaWRlID0gInllYXJMaXN0Vmll
d0RpZEhpZGUiOwotWWVhckxpc3RWaWV3LkV2ZW50VHlwZVllYXJMaXN0Vmlld0RpZFNlbGVjdE1v
bnRoID0gInllYXJMaXN0Vmlld0RpZFNlbGVjdE1vbnRoIjsKLQotLyoqCi0gKiBAcGFyYW0gez9F
dmVudH0gZXZlbnQKLSAqLwotWWVhckxpc3RWaWV3LnByb3RvdHlwZS5vblRvdWNoU3RhcnQgPSBm
dW5jdGlvbihldmVudCkgewotICAgIHZhciB0b3VjaCA9IGV2ZW50LnRvdWNoZXNbMF07Ci0gICAg
dmFyIG1vbnRoQnV0dG9uRWxlbWVudCA9IGVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3ModG91
Y2gudGFyZ2V0LCBZZWFyTGlzdENlbGwuQ2xhc3NOYW1lTW9udGhCdXR0b24pOwotICAgIGlmICgh
bW9udGhCdXR0b25FbGVtZW50KQotICAgICAgICByZXR1cm47Ci0gICAgdmFyIGNlbGxFbGVtZW50
ID0gZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcyhtb250aEJ1dHRvbkVsZW1lbnQsIFllYXJM
aXN0Q2VsbC5DbGFzc05hbWVZZWFyTGlzdENlbGwpOwotICAgIHZhciBjZWxsID0gY2VsbEVsZW1l
bnQuJHZpZXc7Ci0gICAgdGhpcy5oaWdobGlnaHRNb250aChuZXcgTW9udGgoY2VsbC5yb3cgKyAx
LCBwYXJzZUludChtb250aEJ1dHRvbkVsZW1lbnQuZGF0YXNldC5tb250aCwgMTApKSk7Ci19Owot
Ci0vKioKLSAqIEBwYXJhbSB7P0V2ZW50fSBldmVudAotICovCi1ZZWFyTGlzdFZpZXcucHJvdG90
eXBlLm9uTW91c2VPdmVyID0gZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB2YXIgbW9udGhCdXR0b25F
bGVtZW50ID0gZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcyhldmVudC50YXJnZXQsIFllYXJM
aXN0Q2VsbC5DbGFzc05hbWVNb250aEJ1dHRvbik7Ci0gICAgaWYgKCFtb250aEJ1dHRvbkVsZW1l
bnQpCi0gICAgICAgIHJldHVybjsKLSAgICB2YXIgY2VsbEVsZW1lbnQgPSBlbmNsb3NpbmdOb2Rl
T3JTZWxmV2l0aENsYXNzKG1vbnRoQnV0dG9uRWxlbWVudCwgWWVhckxpc3RDZWxsLkNsYXNzTmFt
ZVllYXJMaXN0Q2VsbCk7Ci0gICAgdmFyIGNlbGwgPSBjZWxsRWxlbWVudC4kdmlldzsKLSAgICB0
aGlzLmhpZ2hsaWdodE1vbnRoKG5ldyBNb250aChjZWxsLnJvdyArIDEsIHBhcnNlSW50KG1vbnRo
QnV0dG9uRWxlbWVudC5kYXRhc2V0Lm1vbnRoLCAxMCkpKTsKLSAgICB0aGlzLl9pZ25vcmVNb3Vz
ZU91dFVudGlsbE5leHRNb3VzZU92ZXIgPSBmYWxzZTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHs/
RXZlbnR9IGV2ZW50Ci0gKi8KLVllYXJMaXN0Vmlldy5wcm90b3R5cGUub25Nb3VzZU91dCA9IGZ1
bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYgKHRoaXMuX2lnbm9yZU1vdXNlT3V0VW50aWxsTmV4dE1v
dXNlT3ZlcikKLSAgICAgICAgcmV0dXJuOwotICAgIHZhciBtb250aEJ1dHRvbkVsZW1lbnQgPSBl
bmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKGV2ZW50LnRhcmdldCwgWWVhckxpc3RDZWxsLkNs
YXNzTmFtZU1vbnRoQnV0dG9uKTsKLSAgICBpZiAoIW1vbnRoQnV0dG9uRWxlbWVudCkgewotICAg
ICAgICB0aGlzLmRlaGlnaGxpZ2h0TW9udGgoKTsKLSAgICB9Ci19OwotCi0vKioKLSAqIEBwYXJh
bSB7IW51bWJlcn0gd2lkdGggV2lkdGggaW4gcGl4ZWxzLgotICogQG92ZXJyaWRlCi0gKi8KLVll
YXJMaXN0Vmlldy5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbih3aWR0aCkgewotICAgIExp
c3RWaWV3LnByb3RvdHlwZS5zZXRXaWR0aC5jYWxsKHRoaXMsIHdpZHRoIC0gdGhpcy5zY3J1YmJ5
U2Nyb2xsQmFyLmVsZW1lbnQub2Zmc2V0V2lkdGgpOwotICAgIHRoaXMuZWxlbWVudC5zdHlsZS53
aWR0aCA9IHdpZHRoICsgInB4IjsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSBoZWln
aHQgSGVpZ2h0IGluIHBpeGVscy4KLSAqIEBvdmVycmlkZQotICovCi1ZZWFyTGlzdFZpZXcucHJv
dG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCkgewotICAgIExpc3RWaWV3LnByb3Rv
dHlwZS5zZXRIZWlnaHQuY2FsbCh0aGlzLCBoZWlnaHQpOwotICAgIHRoaXMuc2NydWJieVNjcm9s
bEJhci5zZXRIZWlnaHQoaGVpZ2h0KTsKLX07Ci0KLS8qKgotICogQGVudW0ge251bWJlcn0KLSAq
LwotWWVhckxpc3RWaWV3LlJvd0FuaW1hdGlvbkRpcmVjdGlvbiA9IHsKLSAgICBPcGVuaW5nOiAw
LAotICAgIENsb3Npbmc6IDEKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSByb3cKLSAq
IEBwYXJhbSB7IVllYXJMaXN0Vmlldy5Sb3dBbmltYXRpb25EaXJlY3Rpb259IGRpcmVjdGlvbgot
ICovCi1ZZWFyTGlzdFZpZXcucHJvdG90eXBlLl9hbmltYXRlUm93ID0gZnVuY3Rpb24ocm93LCBk
aXJlY3Rpb24pIHsKLSAgICB2YXIgZnJvbVZhbHVlID0gZGlyZWN0aW9uID09PSBZZWFyTGlzdFZp
ZXcuUm93QW5pbWF0aW9uRGlyZWN0aW9uLkNsb3NpbmcgPyBZZWFyTGlzdENlbGwuU2VsZWN0ZWRI
ZWlnaHQgOiBZZWFyTGlzdENlbGwuSGVpZ2h0OwotICAgIHZhciBvbGRBbmltYXRvciA9IHRoaXMu
X3J1bm5pbmdBbmltYXRvcnNbcm93XTsKLSAgICBpZiAob2xkQW5pbWF0b3IpIHsKLSAgICAgICAg
b2xkQW5pbWF0b3Iuc3RvcCgpOwotICAgICAgICBmcm9tVmFsdWUgPSBvbGRBbmltYXRvci5jdXJy
ZW50VmFsdWU7Ci0gICAgfQotICAgIHZhciBjZWxsID0gdGhpcy5jZWxsQXRSb3cocm93KTsKLSAg
ICB2YXIgYW5pbWF0b3IgPSBuZXcgVHJhbnNpdGlvbkFuaW1hdG9yKCk7Ci0gICAgYW5pbWF0b3Iu
c3RlcCA9IHRoaXMub25DZWxsSGVpZ2h0QW5pbWF0b3JTdGVwOwotICAgIGFuaW1hdG9yLnNldEZy
b20oZnJvbVZhbHVlKTsKLSAgICBhbmltYXRvci5zZXRUbyhkaXJlY3Rpb24gPT09IFllYXJMaXN0
Vmlldy5Sb3dBbmltYXRpb25EaXJlY3Rpb24uT3BlbmluZyA/IFllYXJMaXN0Q2VsbC5TZWxlY3Rl
ZEhlaWdodCA6IFllYXJMaXN0Q2VsbC5IZWlnaHQpOwotICAgIGFuaW1hdG9yLnRpbWluZ0Z1bmN0
aW9uID0gQW5pbWF0aW9uVGltaW5nRnVuY3Rpb24uRWFzZUluT3V0OwotICAgIGFuaW1hdG9yLmR1
cmF0aW9uID0gMzAwOwotICAgIGFuaW1hdG9yLnJvdyA9IHJvdzsKLSAgICBhbmltYXRvci5vbihB
bmltYXRvci5FdmVudFR5cGVEaWRBbmltYXRpb25TdG9wLCB0aGlzLm9uQ2VsbEhlaWdodEFuaW1h
dG9yRGlkU3RvcCk7Ci0gICAgdGhpcy5fcnVubmluZ0FuaW1hdG9yc1tyb3ddID0gYW5pbWF0b3I7
Ci0gICAgdGhpcy5fYW5pbWF0aW5nUm93cy5wdXNoKHJvdyk7Ci0gICAgdGhpcy5fYW5pbWF0aW5n
Um93cy5zb3J0KCk7Ci0gICAgYW5pbWF0b3Iuc3RhcnQoKTsKLX07Ci0KLS8qKgotICogQHBhcmFt
IHs/QW5pbWF0b3J9IGFuaW1hdG9yCi0gKi8KLVllYXJMaXN0Vmlldy5wcm90b3R5cGUub25DZWxs
SGVpZ2h0QW5pbWF0b3JEaWRTdG9wID0gZnVuY3Rpb24oYW5pbWF0b3IpIHsKLSAgICBkZWxldGUg
dGhpcy5fcnVubmluZ0FuaW1hdG9yc1thbmltYXRvci5yb3ddOwotICAgIHZhciBpbmRleCA9IHRo
aXMuX2FuaW1hdGluZ1Jvd3MuaW5kZXhPZihhbmltYXRvci5yb3cpOwotICAgIHRoaXMuX2FuaW1h
dGluZ1Jvd3Muc3BsaWNlKGluZGV4LCAxKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshQW5pbWF0
b3J9IGFuaW1hdG9yCi0gKi8KLVllYXJMaXN0Vmlldy5wcm90b3R5cGUub25DZWxsSGVpZ2h0QW5p
bWF0b3JTdGVwID0gZnVuY3Rpb24oYW5pbWF0b3IpIHsKLSAgICB2YXIgY2VsbCA9IHRoaXMuY2Vs
bEF0Um93KGFuaW1hdG9yLnJvdyk7Ci0gICAgaWYgKGNlbGwpCi0gICAgICAgIGNlbGwuc2V0SGVp
Z2h0KGFuaW1hdG9yLmN1cnJlbnRWYWx1ZSk7Ci0gICAgdGhpcy51cGRhdGVDZWxscygpOwotfTsK
LQotLyoqCi0gKiBAcGFyYW0gez9FdmVudH0gZXZlbnQKLSAqLwotWWVhckxpc3RWaWV3LnByb3Rv
dHlwZS5vbkNsaWNrID0gZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB2YXIgb2xkU2VsZWN0ZWRSb3cg
PSB0aGlzLnNlbGVjdGVkUm93OwotICAgIExpc3RWaWV3LnByb3RvdHlwZS5vbkNsaWNrLmNhbGwo
dGhpcywgZXZlbnQpOwotICAgIHZhciB5ZWFyID0gdGhpcy5zZWxlY3RlZFJvdyArIDE7Ci0gICAg
aWYgKHRoaXMuc2VsZWN0ZWRSb3cgIT09IG9sZFNlbGVjdGVkUm93KSB7Ci0gICAgICAgIHZhciBt
b250aCA9IHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA/IHRoaXMuaGlnaGxpZ2h0ZWRNb250aC5tb250
aCA6IDA7Ci0gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChZZWFyTGlzdFZpZXcuRXZlbnRUeXBl
WWVhckxpc3RWaWV3RGlkU2VsZWN0TW9udGgsIHRoaXMsIG5ldyBNb250aCh5ZWFyLCBtb250aCkp
OwotICAgICAgICB0aGlzLnNjcm9sbFZpZXcuc2Nyb2xsVG8odGhpcy5zZWxlY3RlZFJvdyAqIFll
YXJMaXN0Q2VsbC5IZWlnaHQsIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhciBtb250
aEJ1dHRvbiA9IGVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoZXZlbnQudGFyZ2V0LCBZZWFy
TGlzdENlbGwuQ2xhc3NOYW1lTW9udGhCdXR0b24pOwotICAgICAgICBpZiAoIW1vbnRoQnV0dG9u
KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB2YXIgbW9udGggPSBwYXJzZUludChtb250
aEJ1dHRvbi5kYXRhc2V0Lm1vbnRoLCAxMCk7Ci0gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChZ
ZWFyTGlzdFZpZXcuRXZlbnRUeXBlWWVhckxpc3RWaWV3RGlkU2VsZWN0TW9udGgsIHRoaXMsIG5l
dyBNb250aCh5ZWFyLCBtb250aCkpOwotICAgICAgICB0aGlzLmhpZGUoKTsKLSAgICB9Ci19Owot
Ci0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gc2Nyb2xsT2Zmc2V0Ci0gKiBAcmV0dXJuIHshbnVt
YmVyfQotICogQG92ZXJyaWRlCi0gKi8KLVllYXJMaXN0Vmlldy5wcm90b3R5cGUucm93QXRTY3Jv
bGxPZmZzZXQgPSBmdW5jdGlvbihzY3JvbGxPZmZzZXQpIHsKLSAgICB2YXIgcmVtYWluaW5nT2Zm
c2V0ID0gc2Nyb2xsT2Zmc2V0OwotICAgIHZhciBsYXN0QW5pbWF0aW5nUm93ID0gMDsKLSAgICB2
YXIgcm93c1dpdGhJcnJlZ3VsYXJIZWlnaHQgPSB0aGlzLl9hbmltYXRpbmdSb3dzLnNsaWNlKCk7
Ci0gICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3cgPiAtMSAmJiAhdGhpcy5fcnVubmluZ0FuaW1hdG9y
c1t0aGlzLnNlbGVjdGVkUm93XSkgewotICAgICAgICByb3dzV2l0aElycmVndWxhckhlaWdodC5w
dXNoKHRoaXMuc2VsZWN0ZWRSb3cpOwotICAgICAgICByb3dzV2l0aElycmVndWxhckhlaWdodC5z
b3J0KCk7Ci0gICAgfQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93c1dpdGhJcnJlZ3VsYXJI
ZWlnaHQubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgdmFyIHJvdyA9IHJvd3NXaXRoSXJyZWd1bGFy
SGVpZ2h0W2ldOwotICAgICAgICB2YXIgYW5pbWF0b3IgPSB0aGlzLl9ydW5uaW5nQW5pbWF0b3Jz
W3Jvd107Ci0gICAgICAgIHZhciByb3dIZWlnaHQgPSBhbmltYXRvciA/IGFuaW1hdG9yLmN1cnJl
bnRWYWx1ZSA6IFllYXJMaXN0Q2VsbC5TZWxlY3RlZEhlaWdodDsKLSAgICAgICAgaWYgKHJlbWFp
bmluZ09mZnNldCA8PSAocm93IC0gbGFzdEFuaW1hdGluZ1JvdykgKiBZZWFyTGlzdENlbGwuSGVp
Z2h0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdEFuaW1hdGluZ1JvdyArIE1hdGguZmxvb3Io
cmVtYWluaW5nT2Zmc2V0IC8gWWVhckxpc3RDZWxsLkhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAg
ICAgcmVtYWluaW5nT2Zmc2V0IC09IChyb3cgLSBsYXN0QW5pbWF0aW5nUm93KSAqIFllYXJMaXN0
Q2VsbC5IZWlnaHQ7Ci0gICAgICAgIGlmIChyZW1haW5pbmdPZmZzZXQgPD0gKHJvd0hlaWdodCAt
IFllYXJMaXN0Q2VsbC5IZWlnaHQpKQotICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAg
cmVtYWluaW5nT2Zmc2V0IC09IHJvd0hlaWdodCAtIFllYXJMaXN0Q2VsbC5IZWlnaHQ7Ci0gICAg
ICAgIGxhc3RBbmltYXRpbmdSb3cgPSByb3c7Ci0gICAgfQotICAgIHJldHVybiBsYXN0QW5pbWF0
aW5nUm93ICsgTWF0aC5mbG9vcihyZW1haW5pbmdPZmZzZXQgLyBZZWFyTGlzdENlbGwuSGVpZ2h0
KTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSByb3cKLSAqIEByZXR1cm4geyFudW1i
ZXJ9Ci0gKiBAb3ZlcnJpZGUKLSAqLwotWWVhckxpc3RWaWV3LnByb3RvdHlwZS5zY3JvbGxPZmZz
ZXRGb3JSb3cgPSBmdW5jdGlvbihyb3cpIHsKLSAgICB2YXIgc2Nyb2xsT2Zmc2V0ID0gcm93ICog
WWVhckxpc3RDZWxsLkhlaWdodDsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2FuaW1h
dGluZ1Jvd3MubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgdmFyIGFuaW1hdGluZ1JvdyA9IHRoaXMu
X2FuaW1hdGluZ1Jvd3NbaV07Ci0gICAgICAgIGlmIChhbmltYXRpbmdSb3cgPj0gcm93KQotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHZhciBhbmltYXRvciA9IHRoaXMuX3J1bm5pbmdBbmlt
YXRvcnNbYW5pbWF0aW5nUm93XTsKLSAgICAgICAgc2Nyb2xsT2Zmc2V0ICs9IGFuaW1hdG9yLmN1
cnJlbnRWYWx1ZSAtIFllYXJMaXN0Q2VsbC5IZWlnaHQ7Ci0gICAgfQotICAgIGlmICh0aGlzLnNl
bGVjdGVkUm93ID4gLTEgJiYgdGhpcy5zZWxlY3RlZFJvdyA8IHJvdyAmJiAhdGhpcy5fcnVubmlu
Z0FuaW1hdG9yc1t0aGlzLnNlbGVjdGVkUm93XSkgewotICAgICAgICBzY3JvbGxPZmZzZXQgKz0g
WWVhckxpc3RDZWxsLlNlbGVjdGVkSGVpZ2h0IC0gWWVhckxpc3RDZWxsLkhlaWdodDsKLSAgICB9
Ci0gICAgcmV0dXJuIHNjcm9sbE9mZnNldDsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVy
fSByb3cKLSAqIEByZXR1cm4geyFZZWFyTGlzdENlbGx9Ci0gKiBAb3ZlcnJpZGUKLSAqLwotWWVh
ckxpc3RWaWV3LnByb3RvdHlwZS5wcmVwYXJlTmV3Q2VsbCA9IGZ1bmN0aW9uKHJvdykgewotICAg
IHZhciBjZWxsID0gWWVhckxpc3RDZWxsLl9yZWN5Y2xlQmluLnBvcCgpIHx8IG5ldyBZZWFyTGlz
dENlbGwoZ2xvYmFsLnBhcmFtcy5zaG9ydE1vbnRoTGFiZWxzKTsKLSAgICBjZWxsLnJlc2V0KHJv
dyk7Ci0gICAgY2VsbC5zZXRTZWxlY3RlZCh0aGlzLnNlbGVjdGVkUm93ID09PSByb3cpOwotICAg
IGlmICh0aGlzLmhpZ2hsaWdodGVkTW9udGggJiYgcm93ID09PSB0aGlzLmhpZ2hsaWdodGVkTW9u
dGgueWVhciAtIDEpIHsKLSAgICAgICAgY2VsbC5tb250aEJ1dHRvbnNbdGhpcy5oaWdobGlnaHRl
ZE1vbnRoLm1vbnRoXS5jbGFzc0xpc3QuYWRkKFllYXJMaXN0Q2VsbC5DbGFzc05hbWVIaWdobGln
aHRlZCk7Ci0gICAgfQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbC5tb250aEJ1dHRvbnMu
bGVuZ3RoOyArK2kpIHsKLSAgICAgICAgdmFyIG1vbnRoID0gbmV3IE1vbnRoKHJvdyArIDEsIGkp
OwotICAgICAgICBjZWxsLm1vbnRoQnV0dG9uc1tpXS5kaXNhYmxlZCA9IHRoaXMuX21pbmltdW1N
b250aCA+IG1vbnRoIHx8IHRoaXMuX21heGltdW1Nb250aCA8IG1vbnRoOwotICAgIH0KLSAgICB2
YXIgYW5pbWF0b3IgPSB0aGlzLl9ydW5uaW5nQW5pbWF0b3JzW3Jvd107Ci0gICAgaWYgKGFuaW1h
dG9yKQotICAgICAgICBjZWxsLnNldEhlaWdodChhbmltYXRvci5jdXJyZW50VmFsdWUpOwotICAg
IGVsc2UgaWYgKHJvdyA9PT0gdGhpcy5zZWxlY3RlZFJvdykKLSAgICAgICAgY2VsbC5zZXRIZWln
aHQoWWVhckxpc3RDZWxsLlNlbGVjdGVkSGVpZ2h0KTsKLSAgICBlbHNlCi0gICAgICAgIGNlbGwu
c2V0SGVpZ2h0KFllYXJMaXN0Q2VsbC5IZWlnaHQpOwotICAgIHJldHVybiBjZWxsOwotfTsKLQot
LyoqCi0gKiBAb3ZlcnJpZGUKLSAqLwotWWVhckxpc3RWaWV3LnByb3RvdHlwZS51cGRhdGVDZWxs
cyA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBmaXJzdFZpc2libGVSb3cgPSB0aGlzLmZpcnN0Vmlz
aWJsZVJvdygpOwotICAgIHZhciBsYXN0VmlzaWJsZVJvdyA9IHRoaXMubGFzdFZpc2libGVSb3co
KTsKLSAgICBjb25zb2xlLmFzc2VydChmaXJzdFZpc2libGVSb3cgPD0gbGFzdFZpc2libGVSb3cp
OwotICAgIGZvciAodmFyIGMgaW4gdGhpcy5fY2VsbHMpIHsKLSAgICAgICAgdmFyIGNlbGwgPSB0
aGlzLl9jZWxsc1tjXTsKLSAgICAgICAgaWYgKGNlbGwucm93IDwgZmlyc3RWaXNpYmxlUm93IHx8
IGNlbGwucm93ID4gbGFzdFZpc2libGVSb3cpCi0gICAgICAgICAgICB0aGlzLnRocm93QXdheUNl
bGwoY2VsbCk7Ci0gICAgfQotICAgIGZvciAodmFyIGkgPSBmaXJzdFZpc2libGVSb3c7IGkgPD0g
bGFzdFZpc2libGVSb3c7ICsraSkgewotICAgICAgICB2YXIgY2VsbCA9IHRoaXMuX2NlbGxzW2ld
OwotICAgICAgICBpZiAoY2VsbCkKLSAgICAgICAgICAgIGNlbGwuc2V0UG9zaXRpb24odGhpcy5z
Y3JvbGxWaWV3LmNvbnRlbnRQb3NpdGlvbkZvckNvbnRlbnRPZmZzZXQodGhpcy5zY3JvbGxPZmZz
ZXRGb3JSb3coY2VsbC5yb3cpKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRoaXMuYWRk
Q2VsbElmTmVjZXNzYXJ5KGkpOwotICAgIH0KLSAgICB0aGlzLnNldE5lZWRzVXBkYXRlQ2VsbHMo
ZmFsc2UpOwotfTsKLQotLyoqCi0gKiBAb3ZlcnJpZGUKLSAqLwotWWVhckxpc3RWaWV3LnByb3Rv
dHlwZS5kZXNlbGVjdCA9IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLnNlbGVjdGVkUm93ID09
PSBMaXN0Vmlldy5Ob1NlbGVjdGlvbikKLSAgICAgICAgcmV0dXJuOwotICAgIHZhciBzZWxlY3Rl
ZENlbGwgPSB0aGlzLl9jZWxsc1t0aGlzLnNlbGVjdGVkUm93XTsKLSAgICBpZiAoc2VsZWN0ZWRD
ZWxsKQotICAgICAgICBzZWxlY3RlZENlbGwuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgIHRoaXMu
X2FuaW1hdGVSb3codGhpcy5zZWxlY3RlZFJvdywgWWVhckxpc3RWaWV3LlJvd0FuaW1hdGlvbkRp
cmVjdGlvbi5DbG9zaW5nKTsKLSAgICB0aGlzLnNlbGVjdGVkUm93ID0gTGlzdFZpZXcuTm9TZWxl
Y3Rpb247Ci0gICAgdGhpcy5zZXROZWVkc1VwZGF0ZUNlbGxzKHRydWUpOwotfTsKLQotWWVhckxp
c3RWaWV3LnByb3RvdHlwZS5kZXNlbGVjdFdpdGhvdXRBbmltYXRpbmcgPSBmdW5jdGlvbigpIHsK
LSAgICBpZiAodGhpcy5zZWxlY3RlZFJvdyA9PT0gTGlzdFZpZXcuTm9TZWxlY3Rpb24pCi0gICAg
ICAgIHJldHVybjsKLSAgICB2YXIgc2VsZWN0ZWRDZWxsID0gdGhpcy5fY2VsbHNbdGhpcy5zZWxl
Y3RlZFJvd107Ci0gICAgaWYgKHNlbGVjdGVkQ2VsbCkgewotICAgICAgICBzZWxlY3RlZENlbGwu
c2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICBzZWxlY3RlZENlbGwuc2V0SGVpZ2h0KFllYXJM
aXN0Q2VsbC5IZWlnaHQpOwotICAgIH0KLSAgICB0aGlzLnNlbGVjdGVkUm93ID0gTGlzdFZpZXcu
Tm9TZWxlY3Rpb247Ci0gICAgdGhpcy5zZXROZWVkc1VwZGF0ZUNlbGxzKHRydWUpOwotfTsKLQot
LyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IHJvdwotICogQG92ZXJyaWRlCi0gKi8KLVllYXJMaXN0
Vmlldy5wcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24ocm93KSB7Ci0gICAgaWYgKHRoaXMuc2Vs
ZWN0ZWRSb3cgPT09IHJvdykKLSAgICAgICAgcmV0dXJuOwotICAgIHRoaXMuZGVzZWxlY3QoKTsK
LSAgICBpZiAocm93ID09PSBMaXN0Vmlldy5Ob1NlbGVjdGlvbikKLSAgICAgICAgcmV0dXJuOwot
ICAgIHRoaXMuc2VsZWN0ZWRSb3cgPSByb3c7Ci0gICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3cgIT09
IExpc3RWaWV3Lk5vU2VsZWN0aW9uKSB7Ci0gICAgICAgIHZhciBzZWxlY3RlZENlbGwgPSB0aGlz
Ll9jZWxsc1t0aGlzLnNlbGVjdGVkUm93XTsKLSAgICAgICAgdGhpcy5fYW5pbWF0ZVJvdyh0aGlz
LnNlbGVjdGVkUm93LCBZZWFyTGlzdFZpZXcuUm93QW5pbWF0aW9uRGlyZWN0aW9uLk9wZW5pbmcp
OwotICAgICAgICBpZiAoc2VsZWN0ZWRDZWxsKQotICAgICAgICAgICAgc2VsZWN0ZWRDZWxsLnNl
dFNlbGVjdGVkKHRydWUpOwotICAgICAgICB2YXIgbW9udGggPSB0aGlzLmhpZ2hsaWdodGVkTW9u
dGggPyB0aGlzLmhpZ2hsaWdodGVkTW9udGgubW9udGggOiAwOwotICAgICAgICB0aGlzLmhpZ2hs
aWdodE1vbnRoKG5ldyBNb250aCh0aGlzLnNlbGVjdGVkUm93ICsgMSwgbW9udGgpKTsKLSAgICB9
Ci0gICAgdGhpcy5zZXROZWVkc1VwZGF0ZUNlbGxzKHRydWUpOwotfTsKLQotLyoqCi0gKiBAcGFy
YW0geyFudW1iZXJ9IHJvdwotICovCi1ZZWFyTGlzdFZpZXcucHJvdG90eXBlLnNlbGVjdFdpdGhv
dXRBbmltYXRpbmcgPSBmdW5jdGlvbihyb3cpIHsKLSAgICBpZiAodGhpcy5zZWxlY3RlZFJvdyA9
PT0gcm93KQotICAgICAgICByZXR1cm47Ci0gICAgdGhpcy5kZXNlbGVjdFdpdGhvdXRBbmltYXRp
bmcoKTsKLSAgICBpZiAocm93ID09PSBMaXN0Vmlldy5Ob1NlbGVjdGlvbikKLSAgICAgICAgcmV0
dXJuOwotICAgIHRoaXMuc2VsZWN0ZWRSb3cgPSByb3c7Ci0gICAgaWYgKHRoaXMuc2VsZWN0ZWRS
b3cgIT09IExpc3RWaWV3Lk5vU2VsZWN0aW9uKSB7Ci0gICAgICAgIHZhciBzZWxlY3RlZENlbGwg
PSB0aGlzLl9jZWxsc1t0aGlzLnNlbGVjdGVkUm93XTsKLSAgICAgICAgaWYgKHNlbGVjdGVkQ2Vs
bCkgewotICAgICAgICAgICAgc2VsZWN0ZWRDZWxsLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAg
ICAgICAgc2VsZWN0ZWRDZWxsLnNldEhlaWdodChZZWFyTGlzdENlbGwuU2VsZWN0ZWRIZWlnaHQp
OwotICAgICAgICB9Ci0gICAgICAgIHZhciBtb250aCA9IHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA/
IHRoaXMuaGlnaGxpZ2h0ZWRNb250aC5tb250aCA6IDA7Ci0gICAgICAgIHRoaXMuaGlnaGxpZ2h0
TW9udGgobmV3IE1vbnRoKHRoaXMuc2VsZWN0ZWRSb3cgKyAxLCBtb250aCkpOwotICAgIH0KLSAg
ICB0aGlzLnNldE5lZWRzVXBkYXRlQ2VsbHModHJ1ZSk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7
IU1vbnRofSBtb250aAotICogQHJldHVybiB7P0hUTUxCdXR0b25FbGVtZW50fQotICovCi1ZZWFy
TGlzdFZpZXcucHJvdG90eXBlLmJ1dHRvbkZvck1vbnRoID0gZnVuY3Rpb24obW9udGgpIHsKLSAg
ICBpZiAoIW1vbnRoKQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB2YXIgcm93ID0gbW9udGgu
eWVhciAtIDE7Ci0gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxBdFJvdyhyb3cpOwotICAgIGlmICgh
Y2VsbCkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuIGNlbGwubW9udGhCdXR0b25z
W21vbnRoLm1vbnRoXTsKLX07Ci0KLVllYXJMaXN0Vmlldy5wcm90b3R5cGUuZGVoaWdobGlnaHRN
b250aCA9IGZ1bmN0aW9uKCkgewotICAgIGlmICghdGhpcy5oaWdobGlnaHRlZE1vbnRoKQotICAg
ICAgICByZXR1cm47Ci0gICAgdmFyIG1vbnRoQnV0dG9uID0gdGhpcy5idXR0b25Gb3JNb250aCh0
aGlzLmhpZ2hsaWdodGVkTW9udGgpOwotICAgIGlmIChtb250aEJ1dHRvbikgewotICAgICAgICBt
b250aEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFllYXJMaXN0Q2VsbC5DbGFzc05hbWVIaWdobGln
aHRlZCk7Ci0gICAgfQotICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IG51bGw7Ci19OwotCi0v
KioKLSAqIEBwYXJhbSB7IU1vbnRofSBtb250aAotICovCi1ZZWFyTGlzdFZpZXcucHJvdG90eXBl
LmhpZ2hsaWdodE1vbnRoID0gZnVuY3Rpb24obW9udGgpIHsKLSAgICBpZiAodGhpcy5oaWdobGln
aHRlZE1vbnRoICYmIHRoaXMuaGlnaGxpZ2h0ZWRNb250aC5lcXVhbHMobW9udGgpKQotICAgICAg
ICByZXR1cm47Ci0gICAgdGhpcy5kZWhpZ2hsaWdodE1vbnRoKCk7Ci0gICAgdGhpcy5oaWdobGln
aHRlZE1vbnRoID0gbW9udGg7Ci0gICAgaWYgKCF0aGlzLmhpZ2hsaWdodGVkTW9udGgpCi0gICAg
ICAgIHJldHVybjsKLSAgICB2YXIgbW9udGhCdXR0b24gPSB0aGlzLmJ1dHRvbkZvck1vbnRoKHRo
aXMuaGlnaGxpZ2h0ZWRNb250aCk7Ci0gICAgaWYgKG1vbnRoQnV0dG9uKSB7Ci0gICAgICAgIG1v
bnRoQnV0dG9uLmNsYXNzTGlzdC5hZGQoWWVhckxpc3RDZWxsLkNsYXNzTmFtZUhpZ2hsaWdodGVk
KTsKLSAgICB9Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IU1vbnRofSBtb250aAotICovCi1ZZWFy
TGlzdFZpZXcucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihtb250aCkgewotICAgIHRoaXMuX2ln
bm9yZU1vdXNlT3V0VW50aWxsTmV4dE1vdXNlT3ZlciA9IHRydWU7Ci0gICAgCi0gICAgdGhpcy5z
Y3JvbGxUb1Jvdyhtb250aC55ZWFyIC0gMSwgZmFsc2UpOwotICAgIHRoaXMuc2VsZWN0V2l0aG91
dEFuaW1hdGluZyhtb250aC55ZWFyIC0gMSk7Ci0gICAgdGhpcy5oaWdobGlnaHRNb250aChtb250
aCk7Ci19OwotCi1ZZWFyTGlzdFZpZXcucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpIHsKLSAg
ICB0aGlzLmRpc3BhdGNoRXZlbnQoWWVhckxpc3RWaWV3LkV2ZW50VHlwZVllYXJMaXN0Vmlld0Rp
ZEhpZGUsIHRoaXMpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFNb250aH0gbW9udGgKLSAqLwot
WWVhckxpc3RWaWV3LnByb3RvdHlwZS5fbW92ZUhpZ2hsaWdodFRvID0gZnVuY3Rpb24obW9udGgp
IHsKLSAgICB0aGlzLmhpZ2hsaWdodE1vbnRoKG1vbnRoKTsKLSAgICB0aGlzLnNlbGVjdCh0aGlz
LmhpZ2hsaWdodGVkTW9udGgueWVhciAtIDEpOwotCi0gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFll
YXJMaXN0Vmlldy5FdmVudFR5cGVZZWFyTGlzdFZpZXdEaWRTZWxlY3RNb250aCwgdGhpcywgbW9u
dGgpOwotICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUbyh0aGlzLnNlbGVjdGVkUm93ICogWWVh
ckxpc3RDZWxsLkhlaWdodCwgdHJ1ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19OwotCi0vKioKLSAq
IEBwYXJhbSB7P0V2ZW50fSBldmVudAotICovCi1ZZWFyTGlzdFZpZXcucHJvdG90eXBlLm9uS2V5
RG93biA9IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgdmFyIGtleSA9IGV2ZW50LmtleUlkZW50aWZp
ZXI7Ci0gICAgdmFyIGV2ZW50SGFuZGxlZCA9IGZhbHNlOwotICAgIGlmIChrZXkgPT0gIlUrMDA1
NCIpIC8vICd0JyBrZXkuCi0gICAgICAgIGV2ZW50SGFuZGxlZCA9IHRoaXMuX21vdmVIaWdobGln
aHRUbyhNb250aC5jcmVhdGVGcm9tVG9kYXkoKSk7Ci0gICAgZWxzZSBpZiAodGhpcy5oaWdobGln
aHRlZE1vbnRoKSB7Ci0gICAgICAgIGlmIChnbG9iYWwucGFyYW1zLmlzTG9jYWxlUlRMID8ga2V5
ID09ICJSaWdodCIgOiBrZXkgPT0gIkxlZnQiKQotICAgICAgICAgICAgZXZlbnRIYW5kbGVkID0g
dGhpcy5fbW92ZUhpZ2hsaWdodFRvKHRoaXMuaGlnaGxpZ2h0ZWRNb250aC5wcmV2aW91cygpKTsK
LSAgICAgICAgZWxzZSBpZiAoa2V5ID09ICJVcCIpCi0gICAgICAgICAgICBldmVudEhhbmRsZWQg
PSB0aGlzLl9tb3ZlSGlnaGxpZ2h0VG8odGhpcy5oaWdobGlnaHRlZE1vbnRoLnByZXZpb3VzKFll
YXJMaXN0Q2VsbC5CdXR0b25Db2x1bW5zKSk7Ci0gICAgICAgIGVsc2UgaWYgKGdsb2JhbC5wYXJh
bXMuaXNMb2NhbGVSVEwgPyBrZXkgPT0gIkxlZnQiIDoga2V5ID09ICJSaWdodCIpCi0gICAgICAg
ICAgICBldmVudEhhbmRsZWQgPSB0aGlzLl9tb3ZlSGlnaGxpZ2h0VG8odGhpcy5oaWdobGlnaHRl
ZE1vbnRoLm5leHQoKSk7Ci0gICAgICAgIGVsc2UgaWYgKGtleSA9PSAiRG93biIpCi0gICAgICAg
ICAgICBldmVudEhhbmRsZWQgPSB0aGlzLl9tb3ZlSGlnaGxpZ2h0VG8odGhpcy5oaWdobGlnaHRl
ZE1vbnRoLm5leHQoWWVhckxpc3RDZWxsLkJ1dHRvbkNvbHVtbnMpKTsKLSAgICAgICAgZWxzZSBp
ZiAoa2V5ID09ICJQYWdlVXAiKQotICAgICAgICAgICAgZXZlbnRIYW5kbGVkID0gdGhpcy5fbW92
ZUhpZ2hsaWdodFRvKHRoaXMuaGlnaGxpZ2h0ZWRNb250aC5wcmV2aW91cyhNb250aHNQZXJZZWFy
KSk7Ci0gICAgICAgIGVsc2UgaWYgKGtleSA9PSAiUGFnZURvd24iKQotICAgICAgICAgICAgZXZl
bnRIYW5kbGVkID0gdGhpcy5fbW92ZUhpZ2hsaWdodFRvKHRoaXMuaGlnaGxpZ2h0ZWRNb250aC5u
ZXh0KE1vbnRoc1BlclllYXIpKTsKLSAgICAgICAgZWxzZSBpZiAoa2V5ID09ICJFbnRlciIpIHsK
LSAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChZZWFyTGlzdFZpZXcuRXZlbnRUeXBlWWVh
ckxpc3RWaWV3RGlkU2VsZWN0TW9udGgsIHRoaXMsIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCk7Ci0g
ICAgICAgICAgICB0aGlzLmhpZGUoKTsKLSAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IHRydWU7
Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGtleSA9PSAiVXAiKSB7Ci0gICAgICAgIHRoaXMu
c2Nyb2xsVmlldy5zY3JvbGxCeSgtWWVhckxpc3RDZWxsLkhlaWdodCwgdHJ1ZSk7Ci0gICAgICAg
IGV2ZW50SGFuZGxlZCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChrZXkgPT0gIkRvd24iKSB7Ci0g
ICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxCeShZZWFyTGlzdENlbGwuSGVpZ2h0LCB0cnVl
KTsKLSAgICAgICAgZXZlbnRIYW5kbGVkID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGtleSA9PSAi
UGFnZVVwIikgewotICAgICAgICB0aGlzLnNjcm9sbFZpZXcuc2Nyb2xsQnkoLXRoaXMuc2Nyb2xs
Vmlldy5oZWlnaHQoKSwgdHJ1ZSk7Ci0gICAgICAgIGV2ZW50SGFuZGxlZCA9IHRydWU7Ci0gICAg
fSBlbHNlIGlmIChrZXkgPT0gIlBhZ2VEb3duIikgewotICAgICAgICB0aGlzLnNjcm9sbFZpZXcu
c2Nyb2xsQnkodGhpcy5zY3JvbGxWaWV3LmhlaWdodCgpLCB0cnVlKTsKLSAgICAgICAgZXZlbnRI
YW5kbGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoZXZlbnRIYW5kbGVkKSB7Ci0gICAgICAg
IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwotICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgp
OwotICAgIH0KLX07Ci0KLS8qKgotICogQGNvbnN0cnVjdG9yCi0gKiBAZXh0ZW5kcyBWaWV3Ci0g
KiBAcGFyYW0geyFNb250aH0gbWluaW11bU1vbnRoCi0gKiBAcGFyYW0geyFNb250aH0gbWF4aW11
bU1vbnRoCi0gKi8KLWZ1bmN0aW9uIE1vbnRoUG9wdXBWaWV3KG1pbmltdW1Nb250aCwgbWF4aW11
bU1vbnRoKSB7Ci0gICAgVmlldy5jYWxsKHRoaXMsIGNyZWF0ZUVsZW1lbnQoImRpdiIsIE1vbnRo
UG9wdXBWaWV3LkNsYXNzTmFtZU1vbnRoUG9wdXBWaWV3KSk7Ci0KLSAgICAvKioKLSAgICAgKiBA
dHlwZSB7IVllYXJMaXN0Vmlld30KLSAgICAgKiBAY29uc3QKLSAgICAgKi8KLSAgICB0aGlzLnll
YXJMaXN0VmlldyA9IG5ldyBZZWFyTGlzdFZpZXcobWluaW11bU1vbnRoLCBtYXhpbXVtTW9udGgp
OwotICAgIHRoaXMueWVhckxpc3RWaWV3LmF0dGFjaFRvKHRoaXMpOwotCi0gICAgLyoqCi0gICAg
ICogQHR5cGUgeyFib29sZWFufQotICAgICAqLwotICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7
Ci0KLSAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLm9uQ2xp
Y2ssIGZhbHNlKTsKLX0KLQotTW9udGhQb3B1cFZpZXcucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0
ZShWaWV3LnByb3RvdHlwZSk7Ci0KLU1vbnRoUG9wdXBWaWV3LkNsYXNzTmFtZU1vbnRoUG9wdXBW
aWV3ID0gIm1vbnRoLXBvcHVwLXZpZXciOwotCi1Nb250aFBvcHVwVmlldy5wcm90b3R5cGUuc2hv
dyA9IGZ1bmN0aW9uKGluaXRpYWxNb250aCwgY2FsZW5kYXJUYWJsZVJlY3QpIHsKLSAgICB0aGlz
LmlzVmlzaWJsZSA9IHRydWU7Ci0gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmVs
ZW1lbnQpOwotICAgIHRoaXMueWVhckxpc3RWaWV3LnNldFdpZHRoKGNhbGVuZGFyVGFibGVSZWN0
LndpZHRoIC0gMik7Ci0gICAgdGhpcy55ZWFyTGlzdFZpZXcuc2V0SGVpZ2h0KFllYXJMaXN0Vmll
dy5IZWlnaHQpOwotICAgIGlmIChnbG9iYWwucGFyYW1zLmlzTG9jYWxlUlRMKQotICAgICAgICB0
aGlzLnllYXJMaXN0Vmlldy5lbGVtZW50LnN0eWxlLnJpZ2h0ID0gY2FsZW5kYXJUYWJsZVJlY3Qu
eCArICJweCI7Ci0gICAgZWxzZQotICAgICAgICB0aGlzLnllYXJMaXN0Vmlldy5lbGVtZW50LnN0
eWxlLmxlZnQgPSBjYWxlbmRhclRhYmxlUmVjdC54ICsgInB4IjsKLSAgICB0aGlzLnllYXJMaXN0
Vmlldy5lbGVtZW50LnN0eWxlLnRvcCA9IGNhbGVuZGFyVGFibGVSZWN0LnkgKyAicHgiOwotICAg
IHRoaXMueWVhckxpc3RWaWV3LnNob3coaW5pdGlhbE1vbnRoKTsKLSAgICB0aGlzLnllYXJMaXN0
Vmlldy5lbGVtZW50LmZvY3VzKCk7Ci19OwotCi1Nb250aFBvcHVwVmlldy5wcm90b3R5cGUuaGlk
ZSA9IGZ1bmN0aW9uKCkgewotICAgIGlmICghdGhpcy5pc1Zpc2libGUpCi0gICAgICAgIHJldHVy
bjsKLSAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlOwotICAgIHRoaXMuZWxlbWVudC5wYXJlbnRO
b2RlLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7Ci0gICAgdGhpcy55ZWFyTGlzdFZpZXcuaGlk
ZSgpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0gez9FdmVudH0gZXZlbnQKLSAqLwotTW9udGhQb3B1
cFZpZXcucHJvdG90eXBlLm9uQ2xpY2sgPSBmdW5jdGlvbihldmVudCkgewotICAgIGlmIChldmVu
dC50YXJnZXQgIT09IHRoaXMuZWxlbWVudCkKLSAgICAgICAgcmV0dXJuOwotICAgIHRoaXMuaGlk
ZSgpOwotfTsKLQotLyoqCi0gKiBAY29uc3RydWN0b3IKLSAqIEBleHRlbmRzIFZpZXcKLSAqIEBw
YXJhbSB7IW51bWJlcn0gbWF4V2lkdGggTWF4aW11bSB3aWR0aCBpbiBwaXhlbHMuCi0gKi8KLWZ1
bmN0aW9uIE1vbnRoUG9wdXBCdXR0b24obWF4V2lkdGgpIHsKLSAgICBWaWV3LmNhbGwodGhpcywg
Y3JlYXRlRWxlbWVudCgiYnV0dG9uIiwgTW9udGhQb3B1cEJ1dHRvbi5DbGFzc05hbWVNb250aFBv
cHVwQnV0dG9uKSk7Ci0KLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IUVsZW1lbnR9Ci0gICAgICog
QGNvbnN0Ci0gICAgICovCi0gICAgdGhpcy5sYWJlbEVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KCJz
cGFuIiwgTW9udGhQb3B1cEJ1dHRvbi5DbGFzc05hbWVNb250aFBvcHVwQnV0dG9uTGFiZWwsICIt
LS0tLSIpOwotICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmxhYmVsRWxlbWVudCk7
Ci0KLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IUVsZW1lbnR9Ci0gICAgICogQGNvbnN0Ci0gICAg
ICovCi0gICAgdGhpcy5kaXNjbG9zdXJlVHJpYW5nbGVJY29uID0gY3JlYXRlRWxlbWVudCgic3Bh
biIsIE1vbnRoUG9wdXBCdXR0b24uQ2xhc3NOYW1lRGlzY2xvc3VyZVRyaWFuZ2xlKTsKLSAgICB0
aGlzLmRpc2Nsb3N1cmVUcmlhbmdsZUljb24uaW5uZXJIVE1MID0gIjxzdmcgd2lkdGg9JzcnIGhl
aWdodD0nNSc+PHBvbHlnb24gcG9pbnRzPScwLDEgNywxIDMuNSw1JyBzdHlsZT0nZmlsbDojMDAw
MDAwOycgLz48L3N2Zz4iOwotICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmRpc2Ns
b3N1cmVUcmlhbmdsZUljb24pOwotCi0gICAgLyoqCi0gICAgICogQHR5cGUgeyFib29sZWFufQot
ICAgICAqIEBwcm90ZWN0ZWQKLSAgICAgKi8KLSAgICB0aGlzLl91c2VTaG9ydE1vbnRoID0gdGhp
cy5fc2hvdWxkVXNlU2hvcnRNb250aChtYXhXaWR0aCk7Ci0gICAgdGhpcy5lbGVtZW50LnN0eWxl
Lm1heFdpZHRoID0gbWF4V2lkdGggKyAicHgiOwotCi0gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50
TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5vbkNsaWNrLCBmYWxzZSk7Ci19Ci0KLU1vbnRoUG9wdXBC
dXR0b24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShWaWV3LnByb3RvdHlwZSk7Ci0KLU1vbnRo
UG9wdXBCdXR0b24uQ2xhc3NOYW1lTW9udGhQb3B1cEJ1dHRvbiA9ICJtb250aC1wb3B1cC1idXR0
b24iOwotTW9udGhQb3B1cEJ1dHRvbi5DbGFzc05hbWVNb250aFBvcHVwQnV0dG9uTGFiZWwgPSAi
bW9udGgtcG9wdXAtYnV0dG9uLWxhYmVsIjsKLU1vbnRoUG9wdXBCdXR0b24uQ2xhc3NOYW1lRGlz
Y2xvc3VyZVRyaWFuZ2xlID0gImRpc2Nsb3N1cmUtdHJpYW5nbGUiOwotTW9udGhQb3B1cEJ1dHRv
bi5FdmVudFR5cGVCdXR0b25DbGljayA9ICJidXR0b25DbGljayI7Ci0KLS8qKgotICogQHBhcmFt
IHshbnVtYmVyfSBtYXhXaWR0aCBNYXhpbXVtIGF2YWlsYWJsZSB3aWR0aCBpbiBwaXhlbHMuCi0g
KiBAcmV0dXJuIHshYm9vbGVhbn0KLSAqLwotTW9udGhQb3B1cEJ1dHRvbi5wcm90b3R5cGUuX3No
b3VsZFVzZVNob3J0TW9udGggPSBmdW5jdGlvbihtYXhXaWR0aCkgewotICAgIGRvY3VtZW50LmJv
ZHkuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTsKLSAgICB2YXIgbW9udGggPSBNb250aC5NYXhp
bXVtOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTW9udGhzUGVyWWVhcjsgKytpKSB7Ci0gICAg
ICAgIHRoaXMubGFiZWxFbGVtZW50LnRleHRDb250ZW50ID0gbW9udGgudG9Mb2NhbGVTdHJpbmco
KTsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA+IG1heFdpZHRoKQotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIG1vbnRoID0gbW9udGgucHJldmlvdXMoKTsK
LSAgICB9Ci0gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpOwotICAg
IHJldHVybiBmYWxzZTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshTW9udGh9IG1vbnRoCi0gKi8K
LU1vbnRoUG9wdXBCdXR0b24ucHJvdG90eXBlLnNldEN1cnJlbnRNb250aCA9IGZ1bmN0aW9uKG1v
bnRoKSB7Ci0gICAgdGhpcy5sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLl91c2VTaG9y
dE1vbnRoID8gbW9udGgudG9TaG9ydExvY2FsZVN0cmluZygpIDogbW9udGgudG9Mb2NhbGVTdHJp
bmcoKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHs/RXZlbnR9IGV2ZW50Ci0gKi8KLU1vbnRoUG9w
dXBCdXR0b24ucHJvdG90eXBlLm9uQ2xpY2sgPSBmdW5jdGlvbihldmVudCkgewotICAgIHRoaXMu
ZGlzcGF0Y2hFdmVudChNb250aFBvcHVwQnV0dG9uLkV2ZW50VHlwZUJ1dHRvbkNsaWNrLCB0aGlz
KTsKLX07Ci0KLS8qKgotICogQGNvbnN0cnVjdG9yCi0gKiBAZXh0ZW5kcyBWaWV3Ci0gKi8KLWZ1
bmN0aW9uIENhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbigpIHsKLSAgICBWaWV3LmNhbGwodGhpcywg
Y3JlYXRlRWxlbWVudCgiYnV0dG9uIiwgQ2FsZW5kYXJOYXZpZ2F0aW9uQnV0dG9uLkNsYXNzTmFt
ZUNhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbikpOwotICAgIC8qKgotICAgICAqIEB0eXBlIHtudW1i
ZXJ9IFRocmVzaG9sZCBmb3Igc3RhcnRpbmcgcmVwZWF0aW5nIGNsaWNrcyBpbiBtaWxsaXNlY29u
ZHMuCi0gICAgICovCi0gICAgdGhpcy5yZXBlYXRpbmdDbGlja3NTdGFydGluZ1RocmVzaG9sZCA9
IENhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbi5EZWZhdWx0UmVwZWF0aW5nQ2xpY2tzU3RhcnRpbmdU
aHJlc2hvbGQ7Ci0gICAgLyoqCi0gICAgICogQHR5cGUge251bWJlcn0gSW50ZXJ2YWwgYmV0d2Vl
biByZWFwZWF0aW5nIGNsaWNrcyBpbiBtaWxsaXNlY29uZHMuCi0gICAgICovCi0gICAgdGhpcy5y
ZWFwZWF0aW5nQ2xpY2tzSW50ZXJ2YWwgPSBDYWxlbmRhck5hdmlnYXRpb25CdXR0b24uRGVmYXVs
dFJlcGVhdGluZ0NsaWNrc0ludGVydmFsOwotICAgIC8qKgotICAgICAqIEB0eXBlIHs/bnVtYmVy
fSBUaGUgSUQgZm9yIHRoZSB0aW1lb3V0IHRoYXQgdHJpZ2dlcnMgdGhlIHJlcGVhdGluZyBjbGlj
a3MuCi0gICAgICovCi0gICAgdGhpcy5fdGltZXIgPSBudWxsOwotICAgIHRoaXMuZWxlbWVudC5h
ZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMub25DbGljaywgZmFsc2UpOwotICAgIHRoaXMu
ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCB0aGlzLm9uTW91c2VEb3duLCBm
YWxzZSk7Ci0gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCB0
aGlzLm9uVG91Y2hTdGFydCwgZmFsc2UpOwotfTsKLQotQ2FsZW5kYXJOYXZpZ2F0aW9uQnV0dG9u
LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVmlldy5wcm90b3R5cGUpOwotCi1DYWxlbmRhck5h
dmlnYXRpb25CdXR0b24uRGVmYXVsdFJlcGVhdGluZ0NsaWNrc1N0YXJ0aW5nVGhyZXNob2xkID0g
NjAwOwotQ2FsZW5kYXJOYXZpZ2F0aW9uQnV0dG9uLkRlZmF1bHRSZXBlYXRpbmdDbGlja3NJbnRl
cnZhbCA9IDMwMDsKLUNhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbi5MZWZ0TWFyZ2luID0gNDsKLUNh
bGVuZGFyTmF2aWdhdGlvbkJ1dHRvbi5XaWR0aCA9IDI0OwotQ2FsZW5kYXJOYXZpZ2F0aW9uQnV0
dG9uLkNsYXNzTmFtZUNhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbiA9ICJjYWxlbmRhci1uYXZpZ2F0
aW9uLWJ1dHRvbiI7Ci1DYWxlbmRhck5hdmlnYXRpb25CdXR0b24uRXZlbnRUeXBlQnV0dG9uQ2xp
Y2sgPSAiYnV0dG9uQ2xpY2siOwotQ2FsZW5kYXJOYXZpZ2F0aW9uQnV0dG9uLkV2ZW50VHlwZVJl
cGVhdGluZ0J1dHRvbkNsaWNrID0gInJlcGVhdGluZ0J1dHRvbkNsaWNrIjsKLQotLyoqCi0gKiBA
cGFyYW0geyFib29sZWFufSBkaXNhYmxlZAotICovCi1DYWxlbmRhck5hdmlnYXRpb25CdXR0b24u
cHJvdG90eXBlLnNldERpc2FibGVkID0gZnVuY3Rpb24oZGlzYWJsZWQpIHsKLSAgICB0aGlzLmVs
ZW1lbnQuZGlzYWJsZWQgPSBkaXNhYmxlZDsKLX07Ci0KLS8qKgotICogQHBhcmFtIHs/RXZlbnR9
IGV2ZW50Ci0gKi8KLUNhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbi5wcm90b3R5cGUub25DbGljayA9
IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgdGhpcy5kaXNwYXRjaEV2ZW50KENhbGVuZGFyTmF2aWdh
dGlvbkJ1dHRvbi5FdmVudFR5cGVCdXR0b25DbGljaywgdGhpcyk7Ci19OwotCi0vKioKLSAqIEBw
YXJhbSB7P0V2ZW50fSBldmVudAotICovCi1DYWxlbmRhck5hdmlnYXRpb25CdXR0b24ucHJvdG90
eXBlLm9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYgKHRoaXMuX3RpbWVy
ICE9PSBudWxsKQotICAgICAgICByZXR1cm47Ci0gICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0
KHRoaXMub25SZXBlYXRpbmdDbGljaywgdGhpcy5yZXBlYXRpbmdDbGlja3NTdGFydGluZ1RocmVz
aG9sZCk7Ci0gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vbldp
bmRvd1RvdWNoRW5kLCBmYWxzZSk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7P0V2ZW50fSBldmVu
dAotICovCi1DYWxlbmRhck5hdmlnYXRpb25CdXR0b24ucHJvdG90eXBlLm9uV2luZG93VG91Y2hF
bmQgPSBmdW5jdGlvbihldmVudCkgewotICAgIGlmICh0aGlzLl90aW1lciA9PT0gbnVsbCkKLSAg
ICAgICAgcmV0dXJuOwotICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7Ci0gICAgdGhpcy5f
dGltZXIgPSBudWxsOwotICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIs
IHRoaXMub25XaW5kb3dNb3VzZVVwLCBmYWxzZSk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7P0V2
ZW50fSBldmVudAotICovCi1DYWxlbmRhck5hdmlnYXRpb25CdXR0b24ucHJvdG90eXBlLm9uTW91
c2VEb3duID0gZnVuY3Rpb24oZXZlbnQpIHsKLSAgICBpZiAodGhpcy5fdGltZXIgIT09IG51bGwp
Ci0gICAgICAgIHJldHVybjsKLSAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXQodGhpcy5vblJl
cGVhdGluZ0NsaWNrLCB0aGlzLnJlcGVhdGluZ0NsaWNrc1N0YXJ0aW5nVGhyZXNob2xkKTsKLSAg
ICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMub25XaW5kb3dNb3VzZVVw
LCBmYWxzZSk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7P0V2ZW50fSBldmVudAotICovCi1DYWxl
bmRhck5hdmlnYXRpb25CdXR0b24ucHJvdG90eXBlLm9uV2luZG93TW91c2VVcCA9IGZ1bmN0aW9u
KGV2ZW50KSB7Ci0gICAgaWYgKHRoaXMuX3RpbWVyID09PSBudWxsKQotICAgICAgICByZXR1cm47
Ci0gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTsKLSAgICB0aGlzLl90aW1lciA9IG51bGw7
Ci0gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCB0aGlzLm9uV2luZG93
TW91c2VVcCwgZmFsc2UpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0gez9FdmVudH0gZXZlbnQKLSAq
LwotQ2FsZW5kYXJOYXZpZ2F0aW9uQnV0dG9uLnByb3RvdHlwZS5vblJlcGVhdGluZ0NsaWNrID0g
ZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB0aGlzLmRpc3BhdGNoRXZlbnQoQ2FsZW5kYXJOYXZpZ2F0
aW9uQnV0dG9uLkV2ZW50VHlwZVJlcGVhdGluZ0J1dHRvbkNsaWNrLCB0aGlzKTsKLSAgICB0aGlz
Ll90aW1lciA9IHNldFRpbWVvdXQodGhpcy5vblJlcGVhdGluZ0NsaWNrLCB0aGlzLnJlYXBlYXRp
bmdDbGlja3NJbnRlcnZhbCk7Ci19OwotCi0vKioKLSAqIEBjb25zdHJ1Y3RvcgotICogQGV4dGVu
ZHMgVmlldwotICogQHBhcmFtIHshQ2FsZW5kYXJQaWNrZXJ9IGNhbGVuZGFyUGlja2VyCi0gKi8K
LWZ1bmN0aW9uIENhbGVuZGFySGVhZGVyVmlldyhjYWxlbmRhclBpY2tlcikgewotICAgIFZpZXcu
Y2FsbCh0aGlzLCBjcmVhdGVFbGVtZW50KCJkaXYiLCBDYWxlbmRhckhlYWRlclZpZXcuQ2xhc3NO
YW1lQ2FsZW5kYXJIZWFkZXJWaWV3KSk7Ci0gICAgdGhpcy5jYWxlbmRhclBpY2tlciA9IGNhbGVu
ZGFyUGlja2VyOwotICAgIHRoaXMuY2FsZW5kYXJQaWNrZXIub24oQ2FsZW5kYXJQaWNrZXIuRXZl
bnRUeXBlQ3VycmVudE1vbnRoQ2hhbmdlZCwgdGhpcy5vbkN1cnJlbnRNb250aENoYW5nZWQpOwot
ICAgIAotICAgIHZhciB0aXRsZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KCJkaXYiLCBDYWxlbmRh
ckhlYWRlclZpZXcuQ2xhc3NOYW1lQ2FsZW5kYXJUaXRsZSk7Ci0gICAgdGhpcy5lbGVtZW50LmFw
cGVuZENoaWxkKHRpdGxlRWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IU1vbnRo
UG9wdXBCdXR0b259Ci0gICAgICovCi0gICAgdGhpcy5tb250aFBvcHVwQnV0dG9uID0gbmV3IE1v
bnRoUG9wdXBCdXR0b24odGhpcy5jYWxlbmRhclBpY2tlci5jYWxlbmRhclRhYmxlVmlldy53aWR0
aCgpIC0gQ2FsZW5kYXJUYWJsZVZpZXcuQm9yZGVyV2lkdGggKiAyIC0gQ2FsZW5kYXJOYXZpZ2F0
aW9uQnV0dG9uLldpZHRoICogMyAtIENhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbi5MZWZ0TWFyZ2lu
ICogMik7Ci0gICAgdGhpcy5tb250aFBvcHVwQnV0dG9uLmF0dGFjaFRvKHRpdGxlRWxlbWVudCk7
Ci0KLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IUNhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbn0KLSAg
ICAgKiBAY29uc3QKLSAgICAgKi8KLSAgICB0aGlzLl9wcmV2aW91c01vbnRoQnV0dG9uID0gbmV3
IENhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbigpOwotICAgIHRoaXMuX3ByZXZpb3VzTW9udGhCdXR0
b24uYXR0YWNoVG8odGhpcyk7Ci0gICAgdGhpcy5fcHJldmlvdXNNb250aEJ1dHRvbi5vbihDYWxl
bmRhck5hdmlnYXRpb25CdXR0b24uRXZlbnRUeXBlQnV0dG9uQ2xpY2ssIHRoaXMub25OYXZpZ2F0
aW9uQnV0dG9uQ2xpY2spOwotICAgIHRoaXMuX3ByZXZpb3VzTW9udGhCdXR0b24ub24oQ2FsZW5k
YXJOYXZpZ2F0aW9uQnV0dG9uLkV2ZW50VHlwZVJlcGVhdGluZ0J1dHRvbkNsaWNrLCB0aGlzLm9u
TmF2aWdhdGlvbkJ1dHRvbkNsaWNrKTsKLQotICAgIC8qKgotICAgICAqIEB0eXBlIHshQ2FsZW5k
YXJOYXZpZ2F0aW9uQnV0dG9ufQotICAgICAqIEBjb25zdAotICAgICAqLwotICAgIHRoaXMuX3Rv
ZGF5QnV0dG9uID0gbmV3IENhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbigpOwotICAgIHRoaXMuX3Rv
ZGF5QnV0dG9uLmF0dGFjaFRvKHRoaXMpOwotICAgIHRoaXMuX3RvZGF5QnV0dG9uLm9uKENhbGVu
ZGFyTmF2aWdhdGlvbkJ1dHRvbi5FdmVudFR5cGVCdXR0b25DbGljaywgdGhpcy5vbk5hdmlnYXRp
b25CdXR0b25DbGljayk7Ci0gICAgdGhpcy5fdG9kYXlCdXR0b24uZWxlbWVudC5jbGFzc0xpc3Qu
YWRkKENhbGVuZGFySGVhZGVyVmlldy5DbGFzc05hbWVUb2RheUJ1dHRvbik7Ci0gICAgdmFyIG1v
bnRoQ29udGFpbmluZ1RvZGF5ID0gTW9udGguY3JlYXRlRnJvbVRvZGF5KCk7Ci0gICAgdGhpcy5f
dG9kYXlCdXR0b24uc2V0RGlzYWJsZWQobW9udGhDb250YWluaW5nVG9kYXkgPCB0aGlzLmNhbGVu
ZGFyUGlja2VyLm1pbmltdW1Nb250aCB8fCBtb250aENvbnRhaW5pbmdUb2RheSA+IHRoaXMuY2Fs
ZW5kYXJQaWNrZXIubWF4aW11bU1vbnRoKTsKLQotICAgIC8qKgotICAgICAqIEB0eXBlIHshQ2Fs
ZW5kYXJOYXZpZ2F0aW9uQnV0dG9ufQotICAgICAqIEBjb25zdAotICAgICAqLwotICAgIHRoaXMu
X25leHRNb250aEJ1dHRvbiA9IG5ldyBDYWxlbmRhck5hdmlnYXRpb25CdXR0b24oKTsKLSAgICB0
aGlzLl9uZXh0TW9udGhCdXR0b24uYXR0YWNoVG8odGhpcyk7Ci0gICAgdGhpcy5fbmV4dE1vbnRo
QnV0dG9uLm9uKENhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbi5FdmVudFR5cGVCdXR0b25DbGljaywg
dGhpcy5vbk5hdmlnYXRpb25CdXR0b25DbGljayk7Ci0gICAgdGhpcy5fbmV4dE1vbnRoQnV0dG9u
Lm9uKENhbGVuZGFyTmF2aWdhdGlvbkJ1dHRvbi5FdmVudFR5cGVSZXBlYXRpbmdCdXR0b25DbGlj
aywgdGhpcy5vbk5hdmlnYXRpb25CdXR0b25DbGljayk7Ci0KLSAgICBpZiAoZ2xvYmFsLnBhcmFt
cy5pc0xvY2FsZVJUTCkgewotICAgICAgICB0aGlzLl9uZXh0TW9udGhCdXR0b24uZWxlbWVudC5p
bm5lckhUTUwgPSBDYWxlbmRhckhlYWRlclZpZXcuX0JhY2t3YXJkVHJpYW5nbGU7Ci0gICAgICAg
IHRoaXMuX3ByZXZpb3VzTW9udGhCdXR0b24uZWxlbWVudC5pbm5lckhUTUwgPSBDYWxlbmRhckhl
YWRlclZpZXcuX0ZvcndhcmRUcmlhbmdsZTsKLSAgICB9IGVsc2UgewotICAgICAgICB0aGlzLl9u
ZXh0TW9udGhCdXR0b24uZWxlbWVudC5pbm5lckhUTUwgPSBDYWxlbmRhckhlYWRlclZpZXcuX0Zv
cndhcmRUcmlhbmdsZTsKLSAgICAgICAgdGhpcy5fcHJldmlvdXNNb250aEJ1dHRvbi5lbGVtZW50
LmlubmVySFRNTCA9IENhbGVuZGFySGVhZGVyVmlldy5fQmFja3dhcmRUcmlhbmdsZTsKLSAgICB9
Ci19Ci0KLUNhbGVuZGFySGVhZGVyVmlldy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFZpZXcu
cHJvdG90eXBlKTsKLQotQ2FsZW5kYXJIZWFkZXJWaWV3LkhlaWdodCA9IDI0OwotQ2FsZW5kYXJI
ZWFkZXJWaWV3LkJvdHRvbU1hcmdpbiA9IDEwOwotQ2FsZW5kYXJIZWFkZXJWaWV3Ll9Gb3J3YXJk
VHJpYW5nbGUgPSAiPHN2ZyB3aWR0aD0nNCcgaGVpZ2h0PSc3Jz48cG9seWdvbiBwb2ludHM9JzAs
NyAwLDAsIDQsMy41JyBzdHlsZT0nZmlsbDojNmU2ZTZlOycgLz48L3N2Zz4iOwotQ2FsZW5kYXJI
ZWFkZXJWaWV3Ll9CYWNrd2FyZFRyaWFuZ2xlID0gIjxzdmcgd2lkdGg9JzQnIGhlaWdodD0nNyc+
PHBvbHlnb24gcG9pbnRzPScwLDMuNSA0LDcgNCwwJyBzdHlsZT0nZmlsbDojNmU2ZTZlOycgLz48
L3N2Zz4iOwotQ2FsZW5kYXJIZWFkZXJWaWV3LkNsYXNzTmFtZUNhbGVuZGFySGVhZGVyVmlldyA9
ICJjYWxlbmRhci1oZWFkZXItdmlldyI7Ci1DYWxlbmRhckhlYWRlclZpZXcuQ2xhc3NOYW1lQ2Fs
ZW5kYXJUaXRsZSA9ICJjYWxlbmRhci10aXRsZSI7Ci1DYWxlbmRhckhlYWRlclZpZXcuQ2xhc3NO
YW1lVG9kYXlCdXR0b24gPSAidG9kYXktYnV0dG9uIjsKLQotQ2FsZW5kYXJIZWFkZXJWaWV3LnBy
b3RvdHlwZS5vbkN1cnJlbnRNb250aENoYW5nZWQgPSBmdW5jdGlvbigpIHsKLSAgICB0aGlzLm1v
bnRoUG9wdXBCdXR0b24uc2V0Q3VycmVudE1vbnRoKHRoaXMuY2FsZW5kYXJQaWNrZXIuY3VycmVu
dE1vbnRoKCkpOwotICAgIHRoaXMuX3ByZXZpb3VzTW9udGhCdXR0b24uc2V0RGlzYWJsZWQodGhp
cy5kaXNhYmxlZCB8fCB0aGlzLmNhbGVuZGFyUGlja2VyLmN1cnJlbnRNb250aCgpIDw9IHRoaXMu
Y2FsZW5kYXJQaWNrZXIubWluaW11bU1vbnRoKTsKLSAgICB0aGlzLl9uZXh0TW9udGhCdXR0b24u
c2V0RGlzYWJsZWQodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmNhbGVuZGFyUGlja2VyLmN1cnJlbnRN
b250aCgpID49IHRoaXMuY2FsZW5kYXJQaWNrZXIubWF4aW11bU1vbnRoKTsKLX07Ci0KLUNhbGVu
ZGFySGVhZGVyVmlldy5wcm90b3R5cGUub25OYXZpZ2F0aW9uQnV0dG9uQ2xpY2sgPSBmdW5jdGlv
bihzZW5kZXIpIHsKLSAgICBpZiAoc2VuZGVyID09PSB0aGlzLl9wcmV2aW91c01vbnRoQnV0dG9u
KQotICAgICAgICB0aGlzLmNhbGVuZGFyUGlja2VyLnNldEN1cnJlbnRNb250aCh0aGlzLmNhbGVu
ZGFyUGlja2VyLmN1cnJlbnRNb250aCgpLnByZXZpb3VzKCksIENhbGVuZGFyUGlja2VyLk5hdmln
YXRpb25CZWhhdmlvci5XaXRoQW5pbWF0aW9uKTsKLSAgICBlbHNlIGlmIChzZW5kZXIgPT09IHRo
aXMuX25leHRNb250aEJ1dHRvbikKLSAgICAgICAgdGhpcy5jYWxlbmRhclBpY2tlci5zZXRDdXJy
ZW50TW9udGgodGhpcy5jYWxlbmRhclBpY2tlci5jdXJyZW50TW9udGgoKS5uZXh0KCksIENhbGVu
ZGFyUGlja2VyLk5hdmlnYXRpb25CZWhhdmlvci5XaXRoQW5pbWF0aW9uKTsKLSAgICBlbHNlCi0g
ICAgICAgIHRoaXMuY2FsZW5kYXJQaWNrZXIuc2VsZWN0UmFuZ2VDb250YWluaW5nRGF5KERheS5j
cmVhdGVGcm9tVG9kYXkoKSk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IWJvb2xlYW59IGRpc2Fi
bGVkCi0gKi8KLUNhbGVuZGFySGVhZGVyVmlldy5wcm90b3R5cGUuc2V0RGlzYWJsZWQgPSBmdW5j
dGlvbihkaXNhYmxlZCkgewotICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDsKLSAgICB0aGlz
Lm1vbnRoUG9wdXBCdXR0b24uZWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7Ci0gICAg
dGhpcy5fcHJldmlvdXNNb250aEJ1dHRvbi5zZXREaXNhYmxlZCh0aGlzLmRpc2FibGVkIHx8IHRo
aXMuY2FsZW5kYXJQaWNrZXIuY3VycmVudE1vbnRoKCkgPD0gdGhpcy5jYWxlbmRhclBpY2tlci5t
aW5pbXVtTW9udGgpOwotICAgIHRoaXMuX25leHRNb250aEJ1dHRvbi5zZXREaXNhYmxlZCh0aGlz
LmRpc2FibGVkIHx8IHRoaXMuY2FsZW5kYXJQaWNrZXIuY3VycmVudE1vbnRoKCkgPj0gdGhpcy5j
YWxlbmRhclBpY2tlci5tYXhpbXVtTW9udGgpOwotICAgIHZhciBtb250aENvbnRhaW5pbmdUb2Rh
eSA9IE1vbnRoLmNyZWF0ZUZyb21Ub2RheSgpOwotICAgIHRoaXMuX3RvZGF5QnV0dG9uLnNldERp
c2FibGVkKHRoaXMuZGlzYWJsZWQgfHwgbW9udGhDb250YWluaW5nVG9kYXkgPCB0aGlzLmNhbGVu
ZGFyUGlja2VyLm1pbmltdW1Nb250aCB8fCBtb250aENvbnRhaW5pbmdUb2RheSA+IHRoaXMuY2Fs
ZW5kYXJQaWNrZXIubWF4aW11bU1vbnRoKTsKLX07Ci0KLS8qKgotICogQGNvbnN0cnVjdG9yCi0g
KiBAZXh0ZW5kcyBMaXN0Q2VsbAotICovCi1mdW5jdGlvbiBEYXlDZWxsKCkgewotICAgIExpc3RD
ZWxsLmNhbGwodGhpcyk7Ci0gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoRGF5Q2VsbC5D
bGFzc05hbWVEYXlDZWxsKTsKLSAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSBEYXlDZWxs
LldpZHRoICsgInB4IjsKLSAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gRGF5Q2VsbC5I
ZWlnaHQgKyAicHgiOwotICAgIHRoaXMuZWxlbWVudC5zdHlsZS5saW5lSGVpZ2h0ID0gKERheUNl
bGwuSGVpZ2h0IC0gRGF5Q2VsbC5Cb3JkZXJXaWR0aCAqIDIpICsgInB4IjsKLSAgICAvKioKLSAg
ICAgKiBAdHlwZSB7P0RheX0KLSAgICAgKi8KLSAgICB0aGlzLmRheSA9IG51bGw7Ci19OwotCi1E
YXlDZWxsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTGlzdENlbGwucHJvdG90eXBlKTsKLQot
RGF5Q2VsbC5XaWR0aCA9IDM0OwotRGF5Q2VsbC5IZWlnaHQgPSBoYXNJbmFjY3VyYXRlUG9pbnRp
bmdEZXZpY2UoKSA/IDM0IDogMjA7Ci1EYXlDZWxsLkJvcmRlcldpZHRoID0gMTsKLURheUNlbGwu
Q2xhc3NOYW1lRGF5Q2VsbCA9ICJkYXktY2VsbCI7Ci1EYXlDZWxsLkNsYXNzTmFtZUhpZ2hsaWdo
dGVkID0gImhpZ2hsaWdodGVkIjsKLURheUNlbGwuQ2xhc3NOYW1lRGlzYWJsZWQgPSAiZGlzYWJs
ZWQiOwotRGF5Q2VsbC5DbGFzc05hbWVDdXJyZW50TW9udGggPSAiY3VycmVudC1tb250aCI7Ci1E
YXlDZWxsLkNsYXNzTmFtZVRvZGF5ID0gInRvZGF5IjsKLQotRGF5Q2VsbC5fcmVjeWNsZUJpbiA9
IFtdOwotCi1EYXlDZWxsLnJlY3ljbGVPckNyZWF0ZSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVy
biBEYXlDZWxsLl9yZWN5Y2xlQmluLnBvcCgpIHx8IG5ldyBEYXlDZWxsKCk7Ci19OwotCi0vKioK
LSAqIEByZXR1cm4geyFBcnJheX0KLSAqIEBvdmVycmlkZQotICovCi1EYXlDZWxsLnByb3RvdHlw
ZS5fcmVjeWNsZUJpbiA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBEYXlDZWxsLl9yZWN5Y2xl
QmluOwotfTsKLQotLyoqCi0gKiBAb3ZlcnJpZGUKLSAqLwotRGF5Q2VsbC5wcm90b3R5cGUudGhy
b3dBd2F5ID0gZnVuY3Rpb24oKSB7Ci0gICAgTGlzdENlbGwucHJvdG90eXBlLnRocm93QXdheS5j
YWxsKHRoaXMpOwotICAgIHRoaXMuZGF5ID0gbnVsbDsKLX07Ci0KLS8qKgotICogQHBhcmFtIHsh
Ym9vbGVhbn0gaGlnaGxpZ2h0ZWQKLSAqLwotRGF5Q2VsbC5wcm90b3R5cGUuc2V0SGlnaGxpZ2h0
ZWQgPSBmdW5jdGlvbihoaWdobGlnaHRlZCkgewotICAgIGlmIChoaWdobGlnaHRlZCkKLSAgICAg
ICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoRGF5Q2VsbC5DbGFzc05hbWVIaWdobGlnaHRl
ZCk7Ci0gICAgZWxzZQotICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEYXlD
ZWxsLkNsYXNzTmFtZUhpZ2hsaWdodGVkKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshYm9vbGVh
bn0gZGlzYWJsZWQKLSAqLwotRGF5Q2VsbC5wcm90b3R5cGUuc2V0RGlzYWJsZWQgPSBmdW5jdGlv
bihkaXNhYmxlZCkgewotICAgIGlmIChkaXNhYmxlZCkKLSAgICAgICAgdGhpcy5lbGVtZW50LmNs
YXNzTGlzdC5hZGQoRGF5Q2VsbC5DbGFzc05hbWVEaXNhYmxlZCk7Ci0gICAgZWxzZQotICAgICAg
ICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEYXlDZWxsLkNsYXNzTmFtZURpc2FibGVk
KTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshYm9vbGVhbn0gc2VsZWN0ZWQKLSAqLwotRGF5Q2Vs
bC5wcm90b3R5cGUuc2V0SXNJbkN1cnJlbnRNb250aCA9IGZ1bmN0aW9uKHNlbGVjdGVkKSB7Ci0g
ICAgaWYgKHNlbGVjdGVkKQotICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChEYXlD
ZWxsLkNsYXNzTmFtZUN1cnJlbnRNb250aCk7Ci0gICAgZWxzZQotICAgICAgICB0aGlzLmVsZW1l
bnQuY2xhc3NMaXN0LnJlbW92ZShEYXlDZWxsLkNsYXNzTmFtZUN1cnJlbnRNb250aCk7Ci19Owot
Ci0vKioKLSAqIEBwYXJhbSB7IWJvb2xlYW59IHNlbGVjdGVkCi0gKi8KLURheUNlbGwucHJvdG90
eXBlLnNldElzVG9kYXkgPSBmdW5jdGlvbihzZWxlY3RlZCkgewotICAgIGlmIChzZWxlY3RlZCkK
LSAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoRGF5Q2VsbC5DbGFzc05hbWVUb2Rh
eSk7Ci0gICAgZWxzZQotICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEYXlD
ZWxsLkNsYXNzTmFtZVRvZGF5KTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshRGF5fSBkYXkKLSAq
LwotRGF5Q2VsbC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbihkYXkpIHsKLSAgICB0aGlzLmRh
eSA9IGRheTsKLSAgICB0aGlzLmVsZW1lbnQudGV4dENvbnRlbnQgPSBsb2NhbGl6ZU51bWJlcih0
aGlzLmRheS5kYXRlLnRvU3RyaW5nKCkpOwotICAgIHRoaXMuc2hvdygpOwotfTsKLQotLyoqCi0g
KiBAY29uc3RydWN0b3IKLSAqIEBleHRlbmRzIExpc3RDZWxsCi0gKi8KLWZ1bmN0aW9uIFdlZWtO
dW1iZXJDZWxsKCkgewotICAgIExpc3RDZWxsLmNhbGwodGhpcyk7Ci0gICAgdGhpcy5lbGVtZW50
LmNsYXNzTGlzdC5hZGQoV2Vla051bWJlckNlbGwuQ2xhc3NOYW1lV2Vla051bWJlckNlbGwpOwot
ICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9IChXZWVrTnVtYmVyQ2VsbC5XaWR0aCAtIFdl
ZWtOdW1iZXJDZWxsLlJpZ2h0Qm9yZGVyV2lkdGgpICsgInB4IjsKLSAgICB0aGlzLmVsZW1lbnQu
c3R5bGUuaGVpZ2h0ID0gV2Vla051bWJlckNlbGwuSGVpZ2h0ICsgInB4IjsKLSAgICAvKioKLSAg
ICAgKiBAdHlwZSB7P1dlZWt9Ci0gICAgICovCi0gICAgdGhpcy53ZWVrID0gbnVsbDsKLX07Ci0K
LVdlZWtOdW1iZXJDZWxsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTGlzdENlbGwucHJvdG90
eXBlKTsKLQotV2Vla051bWJlckNlbGwuV2lkdGggPSA0ODsKLVdlZWtOdW1iZXJDZWxsLkhlaWdo
dCA9IERheUNlbGwuSGVpZ2h0OwotV2Vla051bWJlckNlbGwuUmlnaHRCb3JkZXJXaWR0aCA9IDE7
Ci1XZWVrTnVtYmVyQ2VsbC5DbGFzc05hbWVXZWVrTnVtYmVyQ2VsbCA9ICJ3ZWVrLW51bWJlci1j
ZWxsIjsKLVdlZWtOdW1iZXJDZWxsLkNsYXNzTmFtZUhpZ2hsaWdodGVkID0gImhpZ2hsaWdodGVk
IjsKLVdlZWtOdW1iZXJDZWxsLkNsYXNzTmFtZURpc2FibGVkID0gImRpc2FibGVkIjsKLQotV2Vl
a051bWJlckNlbGwuX3JlY3ljbGVCaW4gPSBbXTsKLQotLyoqCi0gKiBAcmV0dXJuIHshQXJyYXl9
Ci0gKiBAb3ZlcnJpZGUKLSAqLwotV2Vla051bWJlckNlbGwucHJvdG90eXBlLl9yZWN5Y2xlQmlu
ID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIFdlZWtOdW1iZXJDZWxsLl9yZWN5Y2xlQmluOwot
fTsKLQotLyoqCi0gKiBAcmV0dXJuIHshV2Vla051bWJlckNlbGx9Ci0gKi8KLVdlZWtOdW1iZXJD
ZWxsLnJlY3ljbGVPckNyZWF0ZSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBXZWVrTnVtYmVy
Q2VsbC5fcmVjeWNsZUJpbi5wb3AoKSB8fCBuZXcgV2Vla051bWJlckNlbGwoKTsKLX07Ci0KLS8q
KgotICogQHBhcmFtIHshV2Vla30gd2VlawotICovCi1XZWVrTnVtYmVyQ2VsbC5wcm90b3R5cGUu
cmVzZXQgPSBmdW5jdGlvbih3ZWVrKSB7Ci0gICAgdGhpcy53ZWVrID0gd2VlazsKLSAgICB0aGlz
LmVsZW1lbnQudGV4dENvbnRlbnQgPSBsb2NhbGl6ZU51bWJlcih0aGlzLndlZWsud2Vlay50b1N0
cmluZygpKTsKLSAgICB0aGlzLnNob3coKTsKLX07Ci0KLS8qKgotICogQG92ZXJyaWRlCi0gKi8K
LVdlZWtOdW1iZXJDZWxsLnByb3RvdHlwZS50aHJvd0F3YXkgPSBmdW5jdGlvbigpIHsKLSAgICBM
aXN0Q2VsbC5wcm90b3R5cGUudGhyb3dBd2F5LmNhbGwodGhpcyk7Ci0gICAgdGhpcy53ZWVrID0g
bnVsbDsKLX07Ci0KLVdlZWtOdW1iZXJDZWxsLnByb3RvdHlwZS5zZXRIaWdobGlnaHRlZCA9IGZ1
bmN0aW9uKGhpZ2hsaWdodGVkKSB7Ci0gICAgaWYgKGhpZ2hsaWdodGVkKQotICAgICAgICB0aGlz
LmVsZW1lbnQuY2xhc3NMaXN0LmFkZChXZWVrTnVtYmVyQ2VsbC5DbGFzc05hbWVIaWdobGlnaHRl
ZCk7Ci0gICAgZWxzZQotICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShXZWVr
TnVtYmVyQ2VsbC5DbGFzc05hbWVIaWdobGlnaHRlZCk7Ci19OwotCi1XZWVrTnVtYmVyQ2VsbC5w
cm90b3R5cGUuc2V0RGlzYWJsZWQgPSBmdW5jdGlvbihkaXNhYmxlZCkgewotICAgIGlmIChkaXNh
YmxlZCkKLSAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoV2Vla051bWJlckNlbGwu
Q2xhc3NOYW1lRGlzYWJsZWQpOwotICAgIGVsc2UKLSAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNz
TGlzdC5yZW1vdmUoV2Vla051bWJlckNlbGwuQ2xhc3NOYW1lRGlzYWJsZWQpOwotfTsKLQotLyoq
Ci0gKiBAY29uc3RydWN0b3IKLSAqIEBleHRlbmRzIFZpZXcKLSAqIEBwYXJhbSB7IWJvb2xlYW59
IGhhc1dlZWtOdW1iZXJDb2x1bW4KLSAqLwotZnVuY3Rpb24gQ2FsZW5kYXJUYWJsZUhlYWRlclZp
ZXcoaGFzV2Vla051bWJlckNvbHVtbikgewotICAgIFZpZXcuY2FsbCh0aGlzLCBjcmVhdGVFbGVt
ZW50KCJkaXYiLCAiY2FsZW5kYXItdGFibGUtaGVhZGVyLXZpZXciKSk7Ci0gICAgaWYgKGhhc1dl
ZWtOdW1iZXJDb2x1bW4pIHsKLSAgICAgICAgdmFyIHdlZWtOdW1iZXJMYWJlbEVsZW1lbnQgPSBj
cmVhdGVFbGVtZW50KCJkaXYiLCAid2Vlay1udW1iZXItbGFiZWwiLCBnbG9iYWwucGFyYW1zLndl
ZWtMYWJlbCk7Ci0gICAgICAgIHdlZWtOdW1iZXJMYWJlbEVsZW1lbnQuc3R5bGUud2lkdGggPSBX
ZWVrTnVtYmVyQ2VsbC5XaWR0aCArICJweCI7Ci0gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRD
aGlsZCh3ZWVrTnVtYmVyTGFiZWxFbGVtZW50KTsKLSAgICB9Ci0gICAgZm9yICh2YXIgaSA9IDA7
IGkgPCBEYXlzUGVyV2VlazsgKytpKSB7Ci0gICAgICAgIHZhciB3ZWVrRGF5TnVtYmVyID0gKGds
b2JhbC5wYXJhbXMud2Vla1N0YXJ0RGF5ICsgaSkgJSBEYXlzUGVyV2VlazsKLSAgICAgICAgdmFy
IGxhYmVsRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoImRpdiIsICJ3ZWVrLWRheS1sYWJlbCIsIGds
b2JhbC5wYXJhbXMuZGF5TGFiZWxzW3dlZWtEYXlOdW1iZXJdKTsKLSAgICAgICAgbGFiZWxFbGVt
ZW50LnN0eWxlLndpZHRoID0gRGF5Q2VsbC5XaWR0aCArICJweCI7Ci0gICAgICAgIHRoaXMuZWxl
bWVudC5hcHBlbmRDaGlsZChsYWJlbEVsZW1lbnQpOwotICAgICAgICBpZiAoZ2V0TGFuZ3VhZ2Uo
KSA9PT0gImphIikgewotICAgICAgICAgICAgaWYgKHdlZWtEYXlOdW1iZXIgPT09IDApCi0gICAg
ICAgICAgICAgICAgbGFiZWxFbGVtZW50LnN0eWxlLmNvbG9yID0gInJlZCI7Ci0gICAgICAgICAg
ICBlbHNlIGlmICh3ZWVrRGF5TnVtYmVyID09PSA2KQotICAgICAgICAgICAgICAgIGxhYmVsRWxl
bWVudC5zdHlsZS5jb2xvciA9ICJibHVlIjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotQ2FsZW5k
YXJUYWJsZUhlYWRlclZpZXcucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShWaWV3LnByb3RvdHlw
ZSk7Ci0KLUNhbGVuZGFyVGFibGVIZWFkZXJWaWV3LkhlaWdodCA9IDI1OwotCi0vKioKLSAqIEBj
b25zdHJ1Y3RvcgotICogQGV4dGVuZHMgTGlzdENlbGwKLSAqLwotZnVuY3Rpb24gQ2FsZW5kYXJS
b3dDZWxsKCkgewotICAgIExpc3RDZWxsLmNhbGwodGhpcyk7Ci0gICAgdGhpcy5lbGVtZW50LmNs
YXNzTGlzdC5hZGQoQ2FsZW5kYXJSb3dDZWxsLkNsYXNzTmFtZUNhbGVuZGFyUm93Q2VsbCk7Ci0g
ICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9IENhbGVuZGFyUm93Q2VsbC5IZWlnaHQgKyAi
cHgiOwotCi0gICAgLyoqCi0gICAgICogQHR5cGUgeyFBcnJheX0KLSAgICAgKiBAcHJvdGVjdGVk
Ci0gICAgICovCi0gICAgdGhpcy5fZGF5Q2VsbHMgPSBbXTsKLSAgICAvKioKLSAgICAgKiBAdHlw
ZSB7IW51bWJlcn0KLSAgICAgKi8KLSAgICB0aGlzLnJvdyA9IDA7Ci0gICAgLyoqCi0gICAgICog
QHR5cGUgez9DYWxlbmRhclRhYmxlVmlld30KLSAgICAgKi8KLSAgICB0aGlzLmNhbGVuZGFyVGFi
bGVWaWV3ID0gbnVsbDsKLX0KLQotQ2FsZW5kYXJSb3dDZWxsLnByb3RvdHlwZSA9IE9iamVjdC5j
cmVhdGUoTGlzdENlbGwucHJvdG90eXBlKTsKLQotQ2FsZW5kYXJSb3dDZWxsLkhlaWdodCA9IERh
eUNlbGwuSGVpZ2h0OwotQ2FsZW5kYXJSb3dDZWxsLkNsYXNzTmFtZUNhbGVuZGFyUm93Q2VsbCA9
ICJjYWxlbmRhci1yb3ctY2VsbCI7Ci0KLUNhbGVuZGFyUm93Q2VsbC5fcmVjeWNsZUJpbiA9IFtd
OwotCi0vKioKLSAqIEByZXR1cm4geyFBcnJheX0KLSAqIEBvdmVycmlkZQotICovCi1DYWxlbmRh
clJvd0NlbGwucHJvdG90eXBlLl9yZWN5Y2xlQmluID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJu
IENhbGVuZGFyUm93Q2VsbC5fcmVjeWNsZUJpbjsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVt
YmVyfSByb3cKLSAqIEBwYXJhbSB7IUNhbGVuZGFyVGFibGVWaWV3fSBjYWxlbmRhclRhYmxlVmll
dwotICovCi1DYWxlbmRhclJvd0NlbGwucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24ocm93LCBj
YWxlbmRhclRhYmxlVmlldykgewotICAgIHRoaXMucm93ID0gcm93OwotICAgIHRoaXMuY2FsZW5k
YXJUYWJsZVZpZXcgPSBjYWxlbmRhclRhYmxlVmlldzsKLSAgICBpZiAodGhpcy5jYWxlbmRhclRh
YmxlVmlldy5oYXNXZWVrTnVtYmVyQ29sdW1uKSB7Ci0gICAgICAgIHZhciBtaWRkbGVEYXkgPSB0
aGlzLmNhbGVuZGFyVGFibGVWaWV3LmRheUF0Q29sdW1uQW5kUm93KDMsIHJvdyk7Ci0gICAgICAg
IHZhciB3ZWVrID0gV2Vlay5jcmVhdGVGcm9tRGF5KG1pZGRsZURheSk7Ci0gICAgICAgIHRoaXMu
d2Vla051bWJlckNlbGwgPSB0aGlzLmNhbGVuZGFyVGFibGVWaWV3LnByZXBhcmVOZXdXZWVrTnVt
YmVyQ2VsbCh3ZWVrKTsKLSAgICAgICAgdGhpcy53ZWVrTnVtYmVyQ2VsbC5hdHRhY2hUbyh0aGlz
KTsKLSAgICB9Ci0gICAgdmFyIGRheSA9IGNhbGVuZGFyVGFibGVWaWV3LmRheUF0Q29sdW1uQW5k
Um93KDAsIHJvdyk7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBEYXlzUGVyV2VlazsgKytpKSB7
Ci0gICAgICAgIHZhciBkYXlDZWxsID0gdGhpcy5jYWxlbmRhclRhYmxlVmlldy5wcmVwYXJlTmV3
RGF5Q2VsbChkYXkpOwotICAgICAgICBkYXlDZWxsLmF0dGFjaFRvKHRoaXMpOwotICAgICAgICB0
aGlzLl9kYXlDZWxscy5wdXNoKGRheUNlbGwpOwotICAgICAgICBkYXkgPSBkYXkubmV4dCgpOwot
ICAgIH0KLSAgICB0aGlzLnNob3coKTsKLX07Ci0KLS8qKgotICogQG92ZXJyaWRlCi0gKi8KLUNh
bGVuZGFyUm93Q2VsbC5wcm90b3R5cGUudGhyb3dBd2F5ID0gZnVuY3Rpb24oKSB7Ci0gICAgTGlz
dENlbGwucHJvdG90eXBlLnRocm93QXdheS5jYWxsKHRoaXMpOwotICAgIGlmICh0aGlzLndlZWtO
dW1iZXJDZWxsKQotICAgICAgICB0aGlzLmNhbGVuZGFyVGFibGVWaWV3LnRocm93QXdheVdlZWtO
dW1iZXJDZWxsKHRoaXMud2Vla051bWJlckNlbGwpOwotICAgIHRoaXMuX2RheUNlbGxzLmZvckVh
Y2godGhpcy5jYWxlbmRhclRhYmxlVmlldy50aHJvd0F3YXlEYXlDZWxsLCB0aGlzLmNhbGVuZGFy
VGFibGVWaWV3KTsKLSAgICB0aGlzLl9kYXlDZWxscy5sZW5ndGggPSAwOwotfTsKLQotLyoqCi0g
KiBAY29uc3RydWN0b3IKLSAqIEBleHRlbmRzIExpc3RWaWV3Ci0gKiBAcGFyYW0geyFDYWxlbmRh
clBpY2tlcn0gY2FsZW5kYXJQaWNrZXIKLSAqLwotZnVuY3Rpb24gQ2FsZW5kYXJUYWJsZVZpZXco
Y2FsZW5kYXJQaWNrZXIpIHsKLSAgICBMaXN0Vmlldy5jYWxsKHRoaXMpOwotICAgIHRoaXMuZWxl
bWVudC5jbGFzc0xpc3QuYWRkKENhbGVuZGFyVGFibGVWaWV3LkNsYXNzTmFtZUNhbGVuZGFyVGFi
bGVWaWV3KTsKLSAgICB0aGlzLmVsZW1lbnQudGFiSW5kZXggPSAwOwotCi0gICAgLyoqCi0gICAg
ICogQHR5cGUgeyFib29sZWFufQotICAgICAqIEBjb25zdAotICAgICAqLwotICAgIHRoaXMuaGFz
V2Vla051bWJlckNvbHVtbiA9IGNhbGVuZGFyUGlja2VyLnR5cGUgPT09ICJ3ZWVrIjsKLSAgICAv
KioKLSAgICAgKiBAdHlwZSB7IUNhbGVuZGFyUGlja2VyfQotICAgICAqIEBjb25zdAotICAgICAq
LwotICAgIHRoaXMuY2FsZW5kYXJQaWNrZXIgPSBjYWxlbmRhclBpY2tlcjsKLSAgICAvKioKLSAg
ICAgKiBAdHlwZSB7IU9iamVjdH0KLSAgICAgKiBAY29uc3QKLSAgICAgKi8KLSAgICB0aGlzLl9k
YXlDZWxscyA9IHt9OwotICAgIHZhciBoZWFkZXJWaWV3ID0gbmV3IENhbGVuZGFyVGFibGVIZWFk
ZXJWaWV3KHRoaXMuaGFzV2Vla051bWJlckNvbHVtbik7Ci0gICAgaGVhZGVyVmlldy5hdHRhY2hU
byh0aGlzLCB0aGlzLnNjcm9sbFZpZXcpOwotCi0gICAgaWYgKHRoaXMuaGFzV2Vla051bWJlckNv
bHVtbikgewotICAgICAgICB0aGlzLnNldFdpZHRoKERheUNlbGwuV2lkdGggKiBEYXlzUGVyV2Vl
ayArIFdlZWtOdW1iZXJDZWxsLldpZHRoKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEB0eXBl
IHs/QXJyYXl9Ci0gICAgICAgICAqIEBjb25zdAotICAgICAgICAgKi8KLSAgICAgICAgdGhpcy5f
d2Vla051bWJlckNlbGxzID0gW107Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy5zZXRXaWR0
aChEYXlDZWxsLldpZHRoICogRGF5c1BlcldlZWspOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAg
ICAgKiBAdHlwZSB7IWJvb2xlYW59Ci0gICAgICogQHByb3RlY3RlZAotICAgICAqLwotICAgIHRo
aXMuX2lnbm9yZU1vdXNlT3V0VW50aWxsTmV4dE1vdXNlT3ZlciA9IGZhbHNlOwotCi0gICAgdGhp
cy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5vbkNsaWNrLCBmYWxzZSk7
Ci0gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIHRoaXMub25N
b3VzZU92ZXIsIGZhbHNlKTsKLSAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91
c2VvdXQiLCB0aGlzLm9uTW91c2VPdXQsIGZhbHNlKTsKLQotICAgIC8vIFlvdSBzaG91bGRuJ3Qg
YmUgYWJsZSB0byB1c2UgdGhlIG1vdXNlIHdoZWVsIHRvIHNjcm9sbC4KLSAgICB0aGlzLnNjcm9s
bFZpZXcuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIiwgdGhpcy5zY3Jv
bGxWaWV3Lm9uTW91c2VXaGVlbCwgZmFsc2UpOwotICAgIC8vIFlvdSBzaG91bGRuJ3QgYmUgYWJs
ZSB0byBkbyBnZXN0dXJlIHNjcm9sbC4KLSAgICB0aGlzLnNjcm9sbFZpZXcuZWxlbWVudC5yZW1v
dmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy5zY3JvbGxWaWV3Lm9uVG91Y2hTdGFy
dCwgZmFsc2UpOwotfQotCi1DYWxlbmRhclRhYmxlVmlldy5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKExpc3RWaWV3LnByb3RvdHlwZSk7Ci0KLUNhbGVuZGFyVGFibGVWaWV3LkJvcmRlcldpZHRo
ID0gMTsKLUNhbGVuZGFyVGFibGVWaWV3LkNsYXNzTmFtZUNhbGVuZGFyVGFibGVWaWV3ID0gImNh
bGVuZGFyLXRhYmxlLXZpZXciOwotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gc2Nyb2xsT2Zm
c2V0Ci0gKiBAcmV0dXJuIHshbnVtYmVyfQotICovCi1DYWxlbmRhclRhYmxlVmlldy5wcm90b3R5
cGUucm93QXRTY3JvbGxPZmZzZXQgPSBmdW5jdGlvbihzY3JvbGxPZmZzZXQpIHsKLSAgICByZXR1
cm4gTWF0aC5mbG9vcihzY3JvbGxPZmZzZXQgLyBDYWxlbmRhclJvd0NlbGwuSGVpZ2h0KTsKLX07
Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSByb3cKLSAqIEByZXR1cm4geyFudW1iZXJ9Ci0g
Ki8KLUNhbGVuZGFyVGFibGVWaWV3LnByb3RvdHlwZS5zY3JvbGxPZmZzZXRGb3JSb3cgPSBmdW5j
dGlvbihyb3cpIHsKLSAgICByZXR1cm4gcm93ICogQ2FsZW5kYXJSb3dDZWxsLkhlaWdodDsKLX07
Ci0KLS8qKgotICogQHBhcmFtIHs/RXZlbnR9IGV2ZW50Ci0gKi8KLUNhbGVuZGFyVGFibGVWaWV3
LnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24oZXZlbnQpIHsKLSAgICBpZiAodGhpcy5oYXNX
ZWVrTnVtYmVyQ29sdW1uKSB7Ci0gICAgICAgIHZhciB3ZWVrTnVtYmVyQ2VsbEVsZW1lbnQgPSBl
bmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKGV2ZW50LnRhcmdldCwgV2Vla051bWJlckNlbGwu
Q2xhc3NOYW1lV2Vla051bWJlckNlbGwpOwotICAgICAgICBpZiAod2Vla051bWJlckNlbGxFbGVt
ZW50KSB7Ci0gICAgICAgICAgICB2YXIgd2Vla051bWJlckNlbGwgPSB3ZWVrTnVtYmVyQ2VsbEVs
ZW1lbnQuJHZpZXc7Ci0gICAgICAgICAgICB0aGlzLmNhbGVuZGFyUGlja2VyLnNlbGVjdFJhbmdl
Q29udGFpbmluZ0RheSh3ZWVrTnVtYmVyQ2VsbC53ZWVrLmZpcnN0RGF5KCkpOwotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIHZhciBkYXlDZWxsRWxlbWVudCA9IGVu
Y2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoZXZlbnQudGFyZ2V0LCBEYXlDZWxsLkNsYXNzTmFt
ZURheUNlbGwpOwotICAgIGlmICghZGF5Q2VsbEVsZW1lbnQpCi0gICAgICAgIHJldHVybjsKLSAg
ICB2YXIgZGF5Q2VsbCA9IGRheUNlbGxFbGVtZW50LiR2aWV3OwotICAgIHRoaXMuY2FsZW5kYXJQ
aWNrZXIuc2VsZWN0UmFuZ2VDb250YWluaW5nRGF5KGRheUNlbGwuZGF5KTsKLX07Ci0KLS8qKgot
ICogQHBhcmFtIHs/RXZlbnR9IGV2ZW50Ci0gKi8KLUNhbGVuZGFyVGFibGVWaWV3LnByb3RvdHlw
ZS5vbk1vdXNlT3ZlciA9IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYgKHRoaXMuaGFzV2Vla051
bWJlckNvbHVtbikgewotICAgICAgICB2YXIgd2Vla051bWJlckNlbGxFbGVtZW50ID0gZW5jbG9z
aW5nTm9kZU9yU2VsZldpdGhDbGFzcyhldmVudC50YXJnZXQsIFdlZWtOdW1iZXJDZWxsLkNsYXNz
TmFtZVdlZWtOdW1iZXJDZWxsKTsKLSAgICAgICAgaWYgKHdlZWtOdW1iZXJDZWxsRWxlbWVudCkg
ewotICAgICAgICAgICAgdmFyIHdlZWtOdW1iZXJDZWxsID0gd2Vla051bWJlckNlbGxFbGVtZW50
LiR2aWV3OwotICAgICAgICAgICAgdGhpcy5jYWxlbmRhclBpY2tlci5oaWdobGlnaHRSYW5nZUNv
bnRhaW5pbmdEYXkod2Vla051bWJlckNlbGwud2Vlay5maXJzdERheSgpKTsKLSAgICAgICAgICAg
IHRoaXMuX2lnbm9yZU1vdXNlT3V0VW50aWxsTmV4dE1vdXNlT3ZlciA9IGZhbHNlOwotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIHZhciBkYXlDZWxsRWxlbWVudCA9
IGVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoZXZlbnQudGFyZ2V0LCBEYXlDZWxsLkNsYXNz
TmFtZURheUNlbGwpOwotICAgIGlmICghZGF5Q2VsbEVsZW1lbnQpCi0gICAgICAgIHJldHVybjsK
LSAgICB2YXIgZGF5Q2VsbCA9IGRheUNlbGxFbGVtZW50LiR2aWV3OwotICAgIHRoaXMuY2FsZW5k
YXJQaWNrZXIuaGlnaGxpZ2h0UmFuZ2VDb250YWluaW5nRGF5KGRheUNlbGwuZGF5KTsKLSAgICB0
aGlzLl9pZ25vcmVNb3VzZU91dFVudGlsbE5leHRNb3VzZU92ZXIgPSBmYWxzZTsKLX07Ci0KLS8q
KgotICogQHBhcmFtIHs/RXZlbnR9IGV2ZW50Ci0gKi8KLUNhbGVuZGFyVGFibGVWaWV3LnByb3Rv
dHlwZS5vbk1vdXNlT3V0ID0gZnVuY3Rpb24oZXZlbnQpIHsKLSAgICBpZiAodGhpcy5faWdub3Jl
TW91c2VPdXRVbnRpbGxOZXh0TW91c2VPdmVyKQotICAgICAgICByZXR1cm47Ci0gICAgdmFyIGRh
eUNlbGxFbGVtZW50ID0gZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcyhldmVudC50YXJnZXQs
IERheUNlbGwuQ2xhc3NOYW1lRGF5Q2VsbCk7Ci0gICAgaWYgKCFkYXlDZWxsRWxlbWVudCkgewot
ICAgICAgICB0aGlzLmNhbGVuZGFyUGlja2VyLmhpZ2hsaWdodFJhbmdlQ29udGFpbmluZ0RheShu
dWxsKTsKLSAgICB9Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gcm93Ci0gKiBAcmV0
dXJuIHshQ2FsZW5kYXJSb3dDZWxsfQotICovCi1DYWxlbmRhclRhYmxlVmlldy5wcm90b3R5cGUu
cHJlcGFyZU5ld0NlbGwgPSBmdW5jdGlvbihyb3cpIHsKLSAgICB2YXIgY2VsbCA9IENhbGVuZGFy
Um93Q2VsbC5fcmVjeWNsZUJpbi5wb3AoKSB8fCBuZXcgQ2FsZW5kYXJSb3dDZWxsKCk7Ci0gICAg
Y2VsbC5yZXNldChyb3csIHRoaXMpOwotICAgIHJldHVybiBjZWxsOwotfTsKLQotLyoqCi0gKiBA
cmV0dXJuIHshbnVtYmVyfSBIZWlnaHQgaW4gcGl4ZWxzLgotICovCi1DYWxlbmRhclRhYmxlVmll
dy5wcm90b3R5cGUuaGVpZ2h0ID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuc2Nyb2xs
Vmlldy5oZWlnaHQoKSArIENhbGVuZGFyVGFibGVIZWFkZXJWaWV3LkhlaWdodCArIENhbGVuZGFy
VGFibGVWaWV3LkJvcmRlcldpZHRoICogMjsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVy
fSBoZWlnaHQgSGVpZ2h0IGluIHBpeGVscy4KLSAqLwotQ2FsZW5kYXJUYWJsZVZpZXcucHJvdG90
eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCkgewotICAgIHRoaXMuc2Nyb2xsVmlldy5z
ZXRIZWlnaHQoaGVpZ2h0IC0gQ2FsZW5kYXJUYWJsZUhlYWRlclZpZXcuSGVpZ2h0IC0gQ2FsZW5k
YXJUYWJsZVZpZXcuQm9yZGVyV2lkdGggKiAyKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshTW9u
dGh9IG1vbnRoCi0gKiBAcGFyYW0geyFib29sZWFufSBhbmltYXRlCi0gKi8KLUNhbGVuZGFyVGFi
bGVWaWV3LnByb3RvdHlwZS5zY3JvbGxUb01vbnRoID0gZnVuY3Rpb24obW9udGgsIGFuaW1hdGUp
IHsKLSAgICB2YXIgcm93Rm9yRmlyc3REYXlJbk1vbnRoID0gdGhpcy5jb2x1bW5BbmRSb3dGb3JE
YXkobW9udGguZmlyc3REYXkoKSkucm93OwotICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUbyh0
aGlzLnNjcm9sbE9mZnNldEZvclJvdyhyb3dGb3JGaXJzdERheUluTW9udGgpLCBhbmltYXRlKTsK
LX07Ci0KLS8qKgotICogQHBhcmFtIHshbnVtYmVyfSBjb2x1bW4KLSAqIEBwYXJhbSB7IW51bWJl
cn0gcm93Ci0gKiBAcmV0dXJuIHshRGF5fQotICovCi1DYWxlbmRhclRhYmxlVmlldy5wcm90b3R5
cGUuZGF5QXRDb2x1bW5BbmRSb3cgPSBmdW5jdGlvbihjb2x1bW4sIHJvdykgewotICAgIHZhciBk
YXlzU2luY2VNaW5pbXVtID0gcm93ICogRGF5c1BlcldlZWsgKyBjb2x1bW4gKyBnbG9iYWwucGFy
YW1zLndlZWtTdGFydERheSAtIENhbGVuZGFyVGFibGVWaWV3Ll9NaW5pbXVtRGF5V2Vla0RheTsK
LSAgICByZXR1cm4gRGF5LmNyZWF0ZUZyb21WYWx1ZShkYXlzU2luY2VNaW5pbXVtICogTWlsbGlz
ZWNvbmRzUGVyRGF5ICsgQ2FsZW5kYXJUYWJsZVZpZXcuX01pbmltdW1EYXlWYWx1ZSk7Ci19Owot
Ci1DYWxlbmRhclRhYmxlVmlldy5fTWluaW11bURheVZhbHVlID0gRGF5Lk1pbmltdW0udmFsdWVP
ZigpOwotQ2FsZW5kYXJUYWJsZVZpZXcuX01pbmltdW1EYXlXZWVrRGF5ID0gRGF5Lk1pbmltdW0u
d2Vla0RheSgpOwotCi0vKioKLSAqIEBwYXJhbSB7IURheX0gZGF5Ci0gKiBAcmV0dXJuIHshT2Jq
ZWN0fSBPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGNvbHVtbiBhbmQgcm93LgotICovCi1DYWxlbmRh
clRhYmxlVmlldy5wcm90b3R5cGUuY29sdW1uQW5kUm93Rm9yRGF5ID0gZnVuY3Rpb24oZGF5KSB7
Ci0gICAgdmFyIGRheXNTaW5jZU1pbmltdW0gPSAoZGF5LnZhbHVlT2YoKSAtIENhbGVuZGFyVGFi
bGVWaWV3Ll9NaW5pbXVtRGF5VmFsdWUpIC8gTWlsbGlzZWNvbmRzUGVyRGF5OwotICAgIHZhciBv
ZmZzZXQgPSBkYXlzU2luY2VNaW5pbXVtICsgQ2FsZW5kYXJUYWJsZVZpZXcuX01pbmltdW1EYXlX
ZWVrRGF5IC0gZ2xvYmFsLnBhcmFtcy53ZWVrU3RhcnREYXk7Ci0gICAgdmFyIHJvdyA9IE1hdGgu
Zmxvb3Iob2Zmc2V0IC8gRGF5c1BlcldlZWspOwotICAgIHZhciBjb2x1bW4gPSBvZmZzZXQgLSBy
b3cgKiBEYXlzUGVyV2VlazsKLSAgICByZXR1cm4gewotICAgICAgICBjb2x1bW46IGNvbHVtbiwK
LSAgICAgICAgcm93OiByb3cKLSAgICB9OwotfTsKLQotQ2FsZW5kYXJUYWJsZVZpZXcucHJvdG90
eXBlLnVwZGF0ZUNlbGxzID0gZnVuY3Rpb24oKSB7Ci0gICAgTGlzdFZpZXcucHJvdG90eXBlLnVw
ZGF0ZUNlbGxzLmNhbGwodGhpcyk7Ci0KLSAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5jYWxlbmRh
clBpY2tlci5zZWxlY3Rpb24oKTsKLSAgICB2YXIgZmlyc3REYXlJblNlbGVjdGlvbjsKLSAgICB2
YXIgbGFzdERheUluU2VsZWN0aW9uOwotICAgIGlmIChzZWxlY3Rpb24pIHsKLSAgICAgICAgZmly
c3REYXlJblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5maXJzdERheSgpLnZhbHVlT2YoKTsKLSAgICAg
ICAgbGFzdERheUluU2VsZWN0aW9uID0gc2VsZWN0aW9uLmxhc3REYXkoKS52YWx1ZU9mKCk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgZmlyc3REYXlJblNlbGVjdGlvbiA9IEluZmluaXR5OwotICAg
ICAgICBsYXN0RGF5SW5TZWxlY3Rpb24gPSBJbmZpbml0eTsKLSAgICB9Ci0gICAgdmFyIGhpZ2hs
aWdodCA9IHRoaXMuY2FsZW5kYXJQaWNrZXIuaGlnaGxpZ2h0KCk7Ci0gICAgdmFyIGZpcnN0RGF5
SW5IaWdobGlnaHQ7Ci0gICAgdmFyIGxhc3REYXlJbkhpZ2hsaWdodDsKLSAgICBpZiAoaGlnaGxp
Z2h0KSB7Ci0gICAgICAgIGZpcnN0RGF5SW5IaWdobGlnaHQgPSBoaWdobGlnaHQuZmlyc3REYXko
KS52YWx1ZU9mKCk7Ci0gICAgICAgIGxhc3REYXlJbkhpZ2hsaWdodCA9IGhpZ2hsaWdodC5sYXN0
RGF5KCkudmFsdWVPZigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpcnN0RGF5SW5IaWdobGln
aHQgPSBJbmZpbml0eTsKLSAgICAgICAgbGFzdERheUluSGlnaGxpZ2h0ID0gSW5maW5pdHk7Ci0g
ICAgfQotICAgIHZhciBjdXJyZW50TW9udGggPSB0aGlzLmNhbGVuZGFyUGlja2VyLmN1cnJlbnRN
b250aCgpOwotICAgIHZhciBmaXJzdERheUluQ3VycmVudE1vbnRoID0gY3VycmVudE1vbnRoLmZp
cnN0RGF5KCkudmFsdWVPZigpOwotICAgIHZhciBsYXN0RGF5SW5DdXJyZW50TW9udGggPSBjdXJy
ZW50TW9udGgubGFzdERheSgpLnZhbHVlT2YoKTsKLSAgICBmb3IgKHZhciBkYXlTdHJpbmcgaW4g
dGhpcy5fZGF5Q2VsbHMpIHsKLSAgICAgICAgdmFyIGRheUNlbGwgPSB0aGlzLl9kYXlDZWxsc1tk
YXlTdHJpbmddOwotICAgICAgICB2YXIgZGF5ID0gZGF5Q2VsbC5kYXk7Ci0gICAgICAgIGRheUNl
bGwuc2V0SXNUb2RheShEYXkuY3JlYXRlRnJvbVRvZGF5KCkuZXF1YWxzKGRheSkpOwotICAgICAg
ICBkYXlDZWxsLnNldFNlbGVjdGVkKGRheSA+PSBmaXJzdERheUluU2VsZWN0aW9uICYmIGRheSA8
PSBsYXN0RGF5SW5TZWxlY3Rpb24pOwotICAgICAgICBkYXlDZWxsLnNldEhpZ2hsaWdodGVkKGRh
eSA+PSBmaXJzdERheUluSGlnaGxpZ2h0ICYmIGRheSA8PSBsYXN0RGF5SW5IaWdobGlnaHQpOwot
ICAgICAgICBkYXlDZWxsLnNldElzSW5DdXJyZW50TW9udGgoZGF5ID49IGZpcnN0RGF5SW5DdXJy
ZW50TW9udGggJiYgZGF5IDw9IGxhc3REYXlJbkN1cnJlbnRNb250aCk7Ci0gICAgICAgIGRheUNl
bGwuc2V0RGlzYWJsZWQoIXRoaXMuY2FsZW5kYXJQaWNrZXIuaXNWYWxpZERheShkYXkpKTsKLSAg
ICB9Ci0gICAgaWYgKHRoaXMuaGFzV2Vla051bWJlckNvbHVtbikgewotICAgICAgICBmb3IgKHZh
ciB3ZWVrU3RyaW5nIGluIHRoaXMuX3dlZWtOdW1iZXJDZWxscykgewotICAgICAgICAgICAgdmFy
IHdlZWtOdW1iZXJDZWxsID0gdGhpcy5fd2Vla051bWJlckNlbGxzW3dlZWtTdHJpbmddOwotICAg
ICAgICAgICAgdmFyIHdlZWsgPSB3ZWVrTnVtYmVyQ2VsbC53ZWVrOwotICAgICAgICAgICAgd2Vl
a051bWJlckNlbGwuc2V0U2VsZWN0ZWQoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5lcXVhbHMod2Vl
aykpOwotICAgICAgICAgICAgd2Vla051bWJlckNlbGwuc2V0SGlnaGxpZ2h0ZWQoaGlnaGxpZ2h0
ICYmIGhpZ2hsaWdodC5lcXVhbHMod2VlaykpOwotICAgICAgICAgICAgd2Vla051bWJlckNlbGwu
c2V0RGlzYWJsZWQoIXRoaXMuY2FsZW5kYXJQaWNrZXIuaXNWYWxpZCh3ZWVrKSk7Ci0gICAgICAg
IH0KLSAgICB9Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IURheX0gZGF5Ci0gKiBAcmV0dXJuIHsh
RGF5Q2VsbH0KLSAqLwotQ2FsZW5kYXJUYWJsZVZpZXcucHJvdG90eXBlLnByZXBhcmVOZXdEYXlD
ZWxsID0gZnVuY3Rpb24oZGF5KSB7Ci0gICAgdmFyIGRheUNlbGwgPSBEYXlDZWxsLnJlY3ljbGVP
ckNyZWF0ZSgpOwotICAgIGRheUNlbGwucmVzZXQoZGF5KTsKLSAgICB0aGlzLl9kYXlDZWxsc1tk
YXlDZWxsLmRheS50b1N0cmluZygpXSA9IGRheUNlbGw7Ci0gICAgcmV0dXJuIGRheUNlbGw7Ci19
OwotCi0vKioKLSAqIEBwYXJhbSB7IVdlZWt9IHdlZWsKLSAqIEByZXR1cm4geyFXZWVrTnVtYmVy
Q2VsbH0KLSAqLwotQ2FsZW5kYXJUYWJsZVZpZXcucHJvdG90eXBlLnByZXBhcmVOZXdXZWVrTnVt
YmVyQ2VsbCA9IGZ1bmN0aW9uKHdlZWspIHsKLSAgICB2YXIgd2Vla051bWJlckNlbGwgPSBXZWVr
TnVtYmVyQ2VsbC5yZWN5Y2xlT3JDcmVhdGUoKTsKLSAgICB3ZWVrTnVtYmVyQ2VsbC5yZXNldCh3
ZWVrKTsKLSAgICB0aGlzLl93ZWVrTnVtYmVyQ2VsbHNbd2Vla051bWJlckNlbGwud2Vlay50b1N0
cmluZygpXSA9IHdlZWtOdW1iZXJDZWxsOwotICAgIHJldHVybiB3ZWVrTnVtYmVyQ2VsbDsKLX07
Ci0KLS8qKgotICogQHBhcmFtIHshRGF5Q2VsbH0gZGF5Q2VsbAotICovCi1DYWxlbmRhclRhYmxl
Vmlldy5wcm90b3R5cGUudGhyb3dBd2F5RGF5Q2VsbCA9IGZ1bmN0aW9uKGRheUNlbGwpIHsKLSAg
ICBkZWxldGUgdGhpcy5fZGF5Q2VsbHNbZGF5Q2VsbC5kYXkudG9TdHJpbmcoKV07Ci0gICAgZGF5
Q2VsbC50aHJvd0F3YXkoKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHshV2Vla051bWJlckNlbGx9
IHdlZWtOdW1iZXJDZWxsCi0gKi8KLUNhbGVuZGFyVGFibGVWaWV3LnByb3RvdHlwZS50aHJvd0F3
YXlXZWVrTnVtYmVyQ2VsbCA9IGZ1bmN0aW9uKHdlZWtOdW1iZXJDZWxsKSB7Ci0gICAgZGVsZXRl
IHRoaXMuX3dlZWtOdW1iZXJDZWxsc1t3ZWVrTnVtYmVyQ2VsbC53ZWVrLnRvU3RyaW5nKCldOwot
ICAgIHdlZWtOdW1iZXJDZWxsLnRocm93QXdheSgpOwotfTsKLQotLyoqCi0gKiBAY29uc3RydWN0
b3IKLSAqIEBleHRlbmRzIFZpZXcKLSAqIEBwYXJhbSB7IU9iamVjdH0gY29uZmlnCi0gKi8KLWZ1
bmN0aW9uIENhbGVuZGFyUGlja2VyKHR5cGUsIGNvbmZpZykgewotICAgIFZpZXcuY2FsbCh0aGlz
LCBjcmVhdGVFbGVtZW50KCJkaXYiLCBDYWxlbmRhclBpY2tlci5DbGFzc05hbWVDYWxlbmRhclBp
Y2tlcikpOwotICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKENhbGVuZGFyUGlja2VyLkNs
YXNzTmFtZVByZXBhcmluZyk7Ci0KLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IXN0cmluZ30KLSAg
ICAgKiBAY29uc3QKLSAgICAgKi8KLSAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIGlmICh0aGlz
LnR5cGUgPT09ICJ3ZWVrIikKLSAgICAgICAgdGhpcy5fZGF0ZVR5cGVDb25zdHJ1Y3RvciA9IFdl
ZWs7Ci0gICAgZWxzZSBpZiAodGhpcy50eXBlID09PSAibW9udGgiKQotICAgICAgICB0aGlzLl9k
YXRlVHlwZUNvbnN0cnVjdG9yID0gTW9udGg7Ci0gICAgZWxzZQotICAgICAgICB0aGlzLl9kYXRl
VHlwZUNvbnN0cnVjdG9yID0gRGF5OwotICAgIC8qKgotICAgICAqIEB0eXBlIHshT2JqZWN0fQot
ICAgICAqIEBjb25zdAotICAgICAqLwotICAgIHRoaXMuY29uZmlnID0ge307Ci0gICAgdGhpcy5f
c2V0Q29uZmlnKGNvbmZpZyk7Ci0gICAgLyoqCi0gICAgICogQHR5cGUgeyFNb250aH0KLSAgICAg
KiBAY29uc3QKLSAgICAgKi8KLSAgICB0aGlzLm1pbmltdW1Nb250aCA9IE1vbnRoLmNyZWF0ZUZy
b21EYXkodGhpcy5jb25maWcubWluaW11bS5maXJzdERheSgpKTsKLSAgICAvKioKLSAgICAgKiBA
dHlwZSB7IU1vbnRofQotICAgICAqIEBjb25zdAotICAgICAqLwotICAgIHRoaXMubWF4aW11bU1v
bnRoID0gTW9udGguY3JlYXRlRnJvbURheSh0aGlzLmNvbmZpZy5tYXhpbXVtLmxhc3REYXkoKSk7
Ci0gICAgaWYgKGdsb2JhbC5wYXJhbXMuaXNMb2NhbGVSVEwpCi0gICAgICAgIHRoaXMuZWxlbWVu
dC5jbGFzc0xpc3QuYWRkKCJydGwiKTsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IUNhbGVuZGFy
VGFibGVWaWV3fQotICAgICAqIEBjb25zdAotICAgICAqLwotICAgIHRoaXMuY2FsZW5kYXJUYWJs
ZVZpZXcgPSBuZXcgQ2FsZW5kYXJUYWJsZVZpZXcodGhpcyk7Ci0gICAgdGhpcy5jYWxlbmRhclRh
YmxlVmlldy5oYXNOdW1iZXJDb2x1bW4gPSB0aGlzLnR5cGUgPT09ICJ3ZWVrIjsKLSAgICAvKioK
LSAgICAgKiBAdHlwZSB7IUNhbGVuZGFySGVhZGVyVmlld30KLSAgICAgKiBAY29uc3QKLSAgICAg
Ki8KLSAgICB0aGlzLmNhbGVuZGFySGVhZGVyVmlldyA9IG5ldyBDYWxlbmRhckhlYWRlclZpZXco
dGhpcyk7Ci0gICAgdGhpcy5jYWxlbmRhckhlYWRlclZpZXcubW9udGhQb3B1cEJ1dHRvbi5vbihN
b250aFBvcHVwQnV0dG9uLkV2ZW50VHlwZUJ1dHRvbkNsaWNrLCB0aGlzLm9uTW9udGhQb3B1cEJ1
dHRvbkNsaWNrKTsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7IU1vbnRoUG9wdXBWaWV3fQotICAg
ICAqIEBjb25zdAotICAgICAqLwotICAgIHRoaXMubW9udGhQb3B1cFZpZXcgPSBuZXcgTW9udGhQ
b3B1cFZpZXcodGhpcy5taW5pbXVtTW9udGgsIHRoaXMubWF4aW11bU1vbnRoKTsKLSAgICB0aGlz
Lm1vbnRoUG9wdXBWaWV3LnllYXJMaXN0Vmlldy5vbihZZWFyTGlzdFZpZXcuRXZlbnRUeXBlWWVh
ckxpc3RWaWV3RGlkU2VsZWN0TW9udGgsIHRoaXMub25ZZWFyTGlzdFZpZXdEaWRTZWxlY3RNb250
aCk7Ci0gICAgdGhpcy5tb250aFBvcHVwVmlldy55ZWFyTGlzdFZpZXcub24oWWVhckxpc3RWaWV3
LkV2ZW50VHlwZVllYXJMaXN0Vmlld0RpZEhpZGUsIHRoaXMub25ZZWFyTGlzdFZpZXdEaWRIaWRl
KTsKLSAgICB0aGlzLmNhbGVuZGFySGVhZGVyVmlldy5hdHRhY2hUbyh0aGlzKTsKLSAgICB0aGlz
LmNhbGVuZGFyVGFibGVWaWV3LmF0dGFjaFRvKHRoaXMpOwotICAgIC8qKgotICAgICAqIEB0eXBl
IHshTW9udGh9Ci0gICAgICogQHByb3RlY3RlZAotICAgICAqLwotICAgIHRoaXMuX2N1cnJlbnRN
b250aCA9IG5ldyBNb250aChOYU4sIE5hTik7Ci0gICAgLyoqCi0gICAgICogQHR5cGUgez9EYXRl
VHlwZX0KLSAgICAgKiBAcHJvdGVjdGVkCi0gICAgICovCi0gICAgdGhpcy5fc2VsZWN0aW9uID0g
bnVsbDsKLSAgICAvKioKLSAgICAgKiBAdHlwZSB7P0RhdGVUeXBlfQotICAgICAqIEBwcm90ZWN0
ZWQKLSAgICAgKi8KLSAgICB0aGlzLl9oaWdobGlnaHQgPSBudWxsOwotICAgIHRoaXMuY2FsZW5k
YXJUYWJsZVZpZXcuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5vbkNh
bGVuZGFyVGFibGVLZXlEb3duLCBmYWxzZSk7Ci0gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExp
c3RlbmVyKCJrZXlkb3duIiwgdGhpcy5vbkJvZHlLZXlEb3duLCBmYWxzZSk7Ci0KLSAgICB3aW5k
b3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgdGhpcy5vbldpbmRvd1Jlc2l6ZSwgZmFsc2Up
OwotCi0gICAgLyoqCi0gICAgICogQHR5cGUgeyFudW1iZXJ9Ci0gICAgICogQHByb3RlY3RlZAot
ICAgICAqLwotICAgIHRoaXMuX2hlaWdodCA9IC0xOwotCi0gICAgdmFyIGluaXRpYWxTZWxlY3Rp
b24gPSBwYXJzZURhdGVTdHJpbmcoY29uZmlnLmN1cnJlbnRWYWx1ZSk7Ci0gICAgaWYgKGluaXRp
YWxTZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy5zZXRDdXJyZW50TW9udGgoTW9udGguY3JlYXRl
RnJvbURheShpbml0aWFsU2VsZWN0aW9uLm1pZGRsZURheSgpKSwgQ2FsZW5kYXJQaWNrZXIuTmF2
aWdhdGlvbkJlaGF2aW9yLk5vbmUpOwotICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihpbml0aWFs
U2VsZWN0aW9uKTsKLSAgICB9IGVsc2UKLSAgICAgICAgdGhpcy5zZXRDdXJyZW50TW9udGgoTW9u
dGguY3JlYXRlRnJvbVRvZGF5KCksIENhbGVuZGFyUGlja2VyLk5hdmlnYXRpb25CZWhhdmlvci5O
b25lKTsKLX0KLQotQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShWaWV3
LnByb3RvdHlwZSk7Ci0KLUNhbGVuZGFyUGlja2VyLlBhZGRpbmcgPSAxMDsKLUNhbGVuZGFyUGlj
a2VyLkJvcmRlcldpZHRoID0gMTsKLUNhbGVuZGFyUGlja2VyLkNsYXNzTmFtZUNhbGVuZGFyUGlj
a2VyID0gImNhbGVuZGFyLXBpY2tlciI7Ci1DYWxlbmRhclBpY2tlci5DbGFzc05hbWVQcmVwYXJp
bmcgPSAicHJlcGFyaW5nIjsKLUNhbGVuZGFyUGlja2VyLkV2ZW50VHlwZUN1cnJlbnRNb250aENo
YW5nZWQgPSAiY3VycmVudE1vbnRoQ2hhbmdlZCI7Ci0KLS8qKgotICogQHBhcmFtIHshRXZlbnR9
IGV2ZW50Ci0gKi8KLUNhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5vbldpbmRvd1Jlc2l6ZSA9IGZ1
bmN0aW9uKGV2ZW50KSB7Ci0gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ2FsZW5k
YXJQaWNrZXIuQ2xhc3NOYW1lUHJlcGFyaW5nKTsKLSAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0
ZW5lcigicmVzaXplIiwgdGhpcy5vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpOwotfTsKLQotLyoqCi0g
KiBAcGFyYW0geyFZZWFyTGlzdFZpZXd9IHNlbmRlcgotICovCi1DYWxlbmRhclBpY2tlci5wcm90
b3R5cGUub25ZZWFyTGlzdFZpZXdEaWRIaWRlID0gZnVuY3Rpb24oc2VuZGVyKSB7Ci0gICAgdGhp
cy5tb250aFBvcHVwVmlldy5oaWRlKCk7Ci0gICAgdGhpcy5jYWxlbmRhckhlYWRlclZpZXcuc2V0
RGlzYWJsZWQoZmFsc2UpOwotICAgIHRoaXMuYWRqdXN0SGVpZ2h0KCk7Ci19OwotCi0vKioKLSAq
IEBwYXJhbSB7IVllYXJMaXN0Vmlld30gc2VuZGVyCi0gKiBAcGFyYW0geyFNb250aH0gbW9udGgK
LSAqLwotQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLm9uWWVhckxpc3RWaWV3RGlkU2VsZWN0TW9u
dGggPSBmdW5jdGlvbihzZW5kZXIsIG1vbnRoKSB7Ci0gICAgdGhpcy5zZXRDdXJyZW50TW9udGgo
bW9udGgsIENhbGVuZGFyUGlja2VyLk5hdmlnYXRpb25CZWhhdmlvci5Ob25lKTsKLX07Ci0KLS8q
KgotICogQHBhcmFtIHshVmlld3xOb2RlfSBwYXJlbnQKLSAqIEBwYXJhbSB7P1ZpZXd8Tm9kZT19
IGJlZm9yZQotICogQG92ZXJyaWRlCi0gKi8KLUNhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5hdHRh
Y2hUbyA9IGZ1bmN0aW9uKHBhcmVudCwgYmVmb3JlKSB7Ci0gICAgVmlldy5wcm90b3R5cGUuYXR0
YWNoVG8uY2FsbCh0aGlzLCBwYXJlbnQsIGJlZm9yZSk7Ci0gICAgdGhpcy5jYWxlbmRhclRhYmxl
Vmlldy5lbGVtZW50LmZvY3VzKCk7Ci19OwotCi1DYWxlbmRhclBpY2tlci5wcm90b3R5cGUuY2xl
YW51cCA9IGZ1bmN0aW9uKCkgewotICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNp
emUiLCB0aGlzLm9uV2luZG93UmVzaXplLCBmYWxzZSk7Ci0gICAgdGhpcy5jYWxlbmRhclRhYmxl
Vmlldy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLCB0aGlzLm9uQm9keUtl
eURvd24sIGZhbHNlKTsKLSAgICAvLyBNb250aCBwb3B1cCB2aWV3IG1pZ2h0IGJlIGF0dGFjaGVk
IHRvIGRvY3VtZW50LmJvZHkuCi0gICAgdGhpcy5tb250aFBvcHVwVmlldy5oaWRlKCk7Ci19Owot
Ci0vKioKLSAqIEBwYXJhbSB7P01vbnRoUG9wdXBCdXR0b259IHNlbmRlcgotICovCi1DYWxlbmRh
clBpY2tlci5wcm90b3R5cGUub25Nb250aFBvcHVwQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbihzZW5k
ZXIpIHsKLSAgICB2YXIgY2xpZW50UmVjdCA9IHRoaXMuY2FsZW5kYXJUYWJsZVZpZXcuZWxlbWVu
dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKLSAgICB2YXIgY2FsZW5kYXJUYWJsZVJlY3QgPSBu
ZXcgUmVjdGFuZ2xlKGNsaWVudFJlY3QubGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCwg
Y2xpZW50UmVjdC50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCwgY2xpZW50UmVjdC53aWR0
aCwgY2xpZW50UmVjdC5oZWlnaHQpOwotICAgIHRoaXMubW9udGhQb3B1cFZpZXcuc2hvdyh0aGlz
LmN1cnJlbnRNb250aCgpLCBjYWxlbmRhclRhYmxlUmVjdCk7Ci0gICAgdGhpcy5jYWxlbmRhckhl
YWRlclZpZXcuc2V0RGlzYWJsZWQodHJ1ZSk7Ci0gICAgdGhpcy5hZGp1c3RIZWlnaHQoKTsKLX07
Ci0KLUNhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5fc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmln
KSB7Ci0gICAgdGhpcy5jb25maWcubWluaW11bSA9ICh0eXBlb2YgY29uZmlnLm1pbiAhPT0gInVu
ZGVmaW5lZCIgJiYgY29uZmlnLm1pbikgPyBwYXJzZURhdGVTdHJpbmcoY29uZmlnLm1pbikgOiB0
aGlzLl9kYXRlVHlwZUNvbnN0cnVjdG9yLk1pbmltdW07Ci0gICAgdGhpcy5jb25maWcubWF4aW11
bSA9ICh0eXBlb2YgY29uZmlnLm1heCAhPT0gInVuZGVmaW5lZCIgJiYgY29uZmlnLm1heCkgPyBw
YXJzZURhdGVTdHJpbmcoY29uZmlnLm1heCkgOiB0aGlzLl9kYXRlVHlwZUNvbnN0cnVjdG9yLk1h
eGltdW07Ci0gICAgdGhpcy5jb25maWcubWluaW11bVZhbHVlID0gdGhpcy5jb25maWcubWluaW11
bS52YWx1ZU9mKCk7Ci0gICAgdGhpcy5jb25maWcubWF4aW11bVZhbHVlID0gdGhpcy5jb25maWcu
bWF4aW11bS52YWx1ZU9mKCk7Ci0gICAgdGhpcy5jb25maWcuc3RlcCA9ICh0eXBlb2YgY29uZmln
LnN0ZXAgIT09IHVuZGVmaW5lZCkgPyBOdW1iZXIoY29uZmlnLnN0ZXApIDogdGhpcy5fZGF0ZVR5
cGVDb25zdHJ1Y3Rvci5EZWZhdWx0U3RlcDsKLSAgICB0aGlzLmNvbmZpZy5zdGVwQmFzZSA9ICh0
eXBlb2YgY29uZmlnLnN0ZXBCYXNlICE9PSAidW5kZWZpbmVkIikgPyBOdW1iZXIoY29uZmlnLnN0
ZXBCYXNlKSA6IHRoaXMuX2RhdGVUeXBlQ29uc3RydWN0b3IuRGVmYXVsdFN0ZXBCYXNlOwotfTsK
LQotLyoqCi0gKiBAcmV0dXJuIHshTW9udGh9Ci0gKi8KLUNhbGVuZGFyUGlja2VyLnByb3RvdHlw
ZS5jdXJyZW50TW9udGggPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5fY3VycmVudE1v
bnRoOwotfTsKLQotLyoqCi0gKiBAZW51bSB7bnVtYmVyfQotICovCi1DYWxlbmRhclBpY2tlci5O
YXZpZ2F0aW9uQmVoYXZpb3IgPSB7Ci0gICAgTm9uZTogMCwKLSAgICBXaXRoQW5pbWF0aW9uOiAx
Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IU1vbnRofSBtb250aAotICogQHBhcmFtIHshQ2FsZW5k
YXJQaWNrZXIuTmF2aWdhdGlvbkJlaGF2aW9yfSBhbmltYXRlCi0gKi8KLUNhbGVuZGFyUGlja2Vy
LnByb3RvdHlwZS5zZXRDdXJyZW50TW9udGggPSBmdW5jdGlvbihtb250aCwgYmVoYXZpb3IpIHsK
LSAgICBpZiAobW9udGggPiB0aGlzLm1heGltdW1Nb250aCkKLSAgICAgICAgbW9udGggPSB0aGlz
Lm1heGltdW1Nb250aDsKLSAgICBlbHNlIGlmIChtb250aCA8IHRoaXMubWluaW11bU1vbnRoKQot
ICAgICAgICBtb250aCA9IHRoaXMubWluaW11bU1vbnRoOwotICAgIGlmICh0aGlzLl9jdXJyZW50
TW9udGguZXF1YWxzKG1vbnRoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIHRoaXMuX2N1cnJlbnRN
b250aCA9IG1vbnRoOwotICAgIHRoaXMuY2FsZW5kYXJUYWJsZVZpZXcuc2Nyb2xsVG9Nb250aCh0
aGlzLl9jdXJyZW50TW9udGgsIGJlaGF2aW9yID09PSBDYWxlbmRhclBpY2tlci5OYXZpZ2F0aW9u
QmVoYXZpb3IuV2l0aEFuaW1hdGlvbik7Ci0gICAgdGhpcy5hZGp1c3RIZWlnaHQoKTsKLSAgICB0
aGlzLmNhbGVuZGFyVGFibGVWaWV3LnNldE5lZWRzVXBkYXRlQ2VsbHModHJ1ZSk7Ci0gICAgdGhp
cy5kaXNwYXRjaEV2ZW50KENhbGVuZGFyUGlja2VyLkV2ZW50VHlwZUN1cnJlbnRNb250aENoYW5n
ZWQsIHsKLSAgICAgICAgdGFyZ2V0OiB0aGlzCi0gICAgfSk7Ci19OwotCi1DYWxlbmRhclBpY2tl
ci5wcm90b3R5cGUuYWRqdXN0SGVpZ2h0ID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJvd0ZvckZp
cnN0RGF5SW5Nb250aCA9IHRoaXMuY2FsZW5kYXJUYWJsZVZpZXcuY29sdW1uQW5kUm93Rm9yRGF5
KHRoaXMuX2N1cnJlbnRNb250aC5maXJzdERheSgpKS5yb3c7Ci0gICAgdmFyIHJvd0Zvckxhc3RE
YXlJbk1vbnRoID0gdGhpcy5jYWxlbmRhclRhYmxlVmlldy5jb2x1bW5BbmRSb3dGb3JEYXkodGhp
cy5fY3VycmVudE1vbnRoLmxhc3REYXkoKSkucm93OwotICAgIHZhciBudW1iZXJPZlJvd3MgPSBy
b3dGb3JMYXN0RGF5SW5Nb250aCAtIHJvd0ZvckZpcnN0RGF5SW5Nb250aCArIDE7Ci0gICAgdmFy
IGNhbGVuZGFyVGFibGVWaWV3SGVpZ2h0ID0gQ2FsZW5kYXJUYWJsZUhlYWRlclZpZXcuSGVpZ2h0
ICsgbnVtYmVyT2ZSb3dzICogRGF5Q2VsbC5IZWlnaHQgKyBDYWxlbmRhclRhYmxlVmlldy5Cb3Jk
ZXJXaWR0aCAqIDI7Ci0gICAgdmFyIGhlaWdodCA9ICh0aGlzLm1vbnRoUG9wdXBWaWV3LmlzVmlz
aWJsZSA/IFllYXJMaXN0Vmlldy5IZWlnaHQgOiBjYWxlbmRhclRhYmxlVmlld0hlaWdodCkgKyBD
YWxlbmRhckhlYWRlclZpZXcuSGVpZ2h0ICsgQ2FsZW5kYXJIZWFkZXJWaWV3LkJvdHRvbU1hcmdp
biArIENhbGVuZGFyUGlja2VyLlBhZGRpbmcgKiAyICsgQ2FsZW5kYXJQaWNrZXIuQm9yZGVyV2lk
dGggKiAyOwotICAgIHRoaXMuc2V0SGVpZ2h0KGhlaWdodCk7Ci19OwotCi1DYWxlbmRhclBpY2tl
ci5wcm90b3R5cGUuc2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuX3Nl
bGVjdGlvbjsKLX07Ci0KLUNhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5oaWdobGlnaHQgPSBmdW5j
dGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0OwotfTsKLQotLyoqCi0gKiBAcmV0
dXJuIHshRGF5fQotICovCi1DYWxlbmRhclBpY2tlci5wcm90b3R5cGUuZmlyc3RWaXNpYmxlRGF5
ID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGZpcnN0VmlzaWJsZVJvdyA9IHRoaXMuY2FsZW5kYXJU
YWJsZVZpZXcuY29sdW1uQW5kUm93Rm9yRGF5KHRoaXMuY3VycmVudE1vbnRoKCkuZmlyc3REYXko
KSkucm93OwotICAgIHZhciBmaXJzdFZpc2libGVEYXkgPSB0aGlzLmNhbGVuZGFyVGFibGVWaWV3
LmRheUF0Q29sdW1uQW5kUm93KDAsIGZpcnN0VmlzaWJsZVJvdyk7Ci0gICAgaWYgKCFmaXJzdFZp
c2libGVEYXkpCi0gICAgICAgIGZpcnN0VmlzaWJsZURheSA9IERheS5NaW5pbXVtOwotICAgIHJl
dHVybiBmaXJzdFZpc2libGVEYXk7Ci19OwotCi0vKioKLSAqIEByZXR1cm4geyFEYXl9Ci0gKi8K
LUNhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5sYXN0VmlzaWJsZURheSA9IGZ1bmN0aW9uKCkgeyAK
LSAgICB2YXIgbGFzdFZpc2libGVSb3cgPSB0aGlzLmNhbGVuZGFyVGFibGVWaWV3LmNvbHVtbkFu
ZFJvd0ZvckRheSh0aGlzLmN1cnJlbnRNb250aCgpLmxhc3REYXkoKSkucm93OwotICAgIHZhciBs
YXN0VmlzaWJsZURheSA9IHRoaXMuY2FsZW5kYXJUYWJsZVZpZXcuZGF5QXRDb2x1bW5BbmRSb3co
RGF5c1BlcldlZWsgLSAxLCBsYXN0VmlzaWJsZVJvdyk7Ci0gICAgaWYgKCFsYXN0VmlzaWJsZURh
eSkKLSAgICAgICAgbGFzdFZpc2libGVEYXkgPSBEYXkuTWF4aW11bTsKLSAgICByZXR1cm4gbGFz
dFZpc2libGVEYXk7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7P0RheX0gZGF5Ci0gKi8KLUNhbGVu
ZGFyUGlja2VyLnByb3RvdHlwZS5zZWxlY3RSYW5nZUNvbnRhaW5pbmdEYXkgPSBmdW5jdGlvbihk
YXkpIHsKLSAgICB2YXIgc2VsZWN0aW9uID0gZGF5ID8gdGhpcy5fZGF0ZVR5cGVDb25zdHJ1Y3Rv
ci5jcmVhdGVGcm9tRGF5KGRheSkgOiBudWxsOwotICAgIHRoaXMuc2V0U2VsZWN0aW9uKHNlbGVj
dGlvbik7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7P0RheX0gZGF5Ci0gKi8KLUNhbGVuZGFyUGlj
a2VyLnByb3RvdHlwZS5oaWdobGlnaHRSYW5nZUNvbnRhaW5pbmdEYXkgPSBmdW5jdGlvbihkYXkp
IHsKLSAgICB2YXIgaGlnaGxpZ2h0ID0gZGF5ID8gdGhpcy5fZGF0ZVR5cGVDb25zdHJ1Y3Rvci5j
cmVhdGVGcm9tRGF5KGRheSkgOiBudWxsOwotICAgIHRoaXMuX3NldEhpZ2hsaWdodChoaWdobGln
aHQpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0gez9EYXRlVHlwZX0gZGF5T3JXZWVrT3JNb250aAot
ICovCi1DYWxlbmRhclBpY2tlci5wcm90b3R5cGUuc2V0U2VsZWN0aW9uID0gZnVuY3Rpb24oZGF5
T3JXZWVrT3JNb250aCkgewotICAgIGlmICghdGhpcy5fc2VsZWN0aW9uICYmICFkYXlPcldlZWtP
ck1vbnRoKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKHRoaXMuX3NlbGVjdGlvbiAmJiB0aGlz
Ll9zZWxlY3Rpb24uZXF1YWxzKGRheU9yV2Vla09yTW9udGgpKQotICAgICAgICByZXR1cm47Ci0g
ICAgdmFyIGZpcnN0RGF5SW5TZWxlY3Rpb24gPSBkYXlPcldlZWtPck1vbnRoLmZpcnN0RGF5KCk7
ICAgIAotICAgIHZhciBsYXN0RGF5SW5TZWxlY3Rpb24gPSBkYXlPcldlZWtPck1vbnRoLmxhc3RE
YXkoKTsKLSAgICBpZiAodGhpcy5maXJzdFZpc2libGVEYXkoKSA8IGZpcnN0RGF5SW5TZWxlY3Rp
b24gfHwgdGhpcy5sYXN0VmlzaWJsZURheSgpID4gbGFzdERheUluU2VsZWN0aW9uKSB7Ci0gICAg
ICAgIC8vIENoYW5nZSBjdXJyZW50IG1vbnRoIG9ubHkgaWYgdGhlIGVudGlyZSBzZWxlY3Rpb24g
d2lsbCBiZSB2aXNpYmxlLgotICAgICAgICB2YXIgY2FuZGlkYXRlQ3VycmVudE1vbnRoID0gbnVs
bDsKLSAgICAgICAgaWYgKHRoaXMuZmlyc3RWaXNpYmxlRGF5KCkgPiBmaXJzdERheUluU2VsZWN0
aW9uIHx8IHRoaXMubGFzdFZpc2libGVEYXkoKSA8IGxhc3REYXlJblNlbGVjdGlvbikKLSAgICAg
ICAgICAgIGNhbmRpZGF0ZUN1cnJlbnRNb250aCA9IE1vbnRoLmNyZWF0ZUZyb21EYXkoZmlyc3RE
YXlJblNlbGVjdGlvbik7Ci0gICAgICAgIGlmIChjYW5kaWRhdGVDdXJyZW50TW9udGgpIHsKLSAg
ICAgICAgICAgIHZhciBmaXJzdFZpc2libGVSb3cgPSB0aGlzLmNhbGVuZGFyVGFibGVWaWV3LmNv
bHVtbkFuZFJvd0ZvckRheShjYW5kaWRhdGVDdXJyZW50TW9udGguZmlyc3REYXkoKSkucm93Owot
ICAgICAgICAgICAgdmFyIGZpcnN0VmlzaWJsZURheSA9IHRoaXMuY2FsZW5kYXJUYWJsZVZpZXcu
ZGF5QXRDb2x1bW5BbmRSb3coMCwgZmlyc3RWaXNpYmxlUm93KTsKLSAgICAgICAgICAgIHZhciBs
YXN0VmlzaWJsZVJvdyA9IHRoaXMuY2FsZW5kYXJUYWJsZVZpZXcuY29sdW1uQW5kUm93Rm9yRGF5
KGNhbmRpZGF0ZUN1cnJlbnRNb250aC5sYXN0RGF5KCkpLnJvdzsKLSAgICAgICAgICAgIHZhciBs
YXN0VmlzaWJsZURheSA9IHRoaXMuY2FsZW5kYXJUYWJsZVZpZXcuZGF5QXRDb2x1bW5BbmRSb3co
RGF5c1BlcldlZWsgLSAxLCBsYXN0VmlzaWJsZVJvdyk7Ci0gICAgICAgICAgICBpZiAoZmlyc3RE
YXlJblNlbGVjdGlvbiA+PSBmaXJzdFZpc2libGVEYXkgJiYgbGFzdERheUluU2VsZWN0aW9uIDw9
IGxhc3RWaXNpYmxlRGF5KQotICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudE1vbnRoKGNh
bmRpZGF0ZUN1cnJlbnRNb250aCwgQ2FsZW5kYXJQaWNrZXIuTmF2aWdhdGlvbkJlaGF2aW9yLldp
dGhBbmltYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotICAgIHRoaXMuX3NldEhpZ2hsaWdodChk
YXlPcldlZWtPck1vbnRoKTsKLSAgICBpZiAoIXRoaXMuaXNWYWxpZChkYXlPcldlZWtPck1vbnRo
KSkKLSAgICAgICAgcmV0dXJuOwotICAgIHRoaXMuX3NlbGVjdGlvbiA9IGRheU9yV2Vla09yTW9u
dGg7Ci0gICAgdGhpcy5jYWxlbmRhclRhYmxlVmlldy5zZXROZWVkc1VwZGF0ZUNlbGxzKHRydWUp
OwotICAgIHdpbmRvdy5wYWdlUG9wdXBDb250cm9sbGVyLnNldFZhbHVlKHRoaXMuX3NlbGVjdGlv
bi50b1N0cmluZygpKTsKLX07Ci0KLS8qKgotICogQHBhcmFtIHs/RGF0ZVR5cGV9IGRheU9yV2Vl
a09yTW9udGgKLSAqLwotQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9zZXRIaWdobGlnaHQgPSBm
dW5jdGlvbihkYXlPcldlZWtPck1vbnRoKSB7Ci0gICAgaWYgKCF0aGlzLl9oaWdobGlnaHQgJiYg
IWRheU9yV2Vla09yTW9udGgpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoIWRheU9yV2Vla09y
TW9udGggJiYgIXRoaXMuX2hpZ2hsaWdodCkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmICh0aGlz
Ll9oaWdobGlnaHQgJiYgdGhpcy5faGlnaGxpZ2h0LmVxdWFscyhkYXlPcldlZWtPck1vbnRoKSkK
LSAgICAgICAgcmV0dXJuOwotICAgIHRoaXMuX2hpZ2hsaWdodCA9IGRheU9yV2Vla09yTW9udGg7
Ci0gICAgdGhpcy5jYWxlbmRhclRhYmxlVmlldy5zZXROZWVkc1VwZGF0ZUNlbGxzKHRydWUpOwot
fTsKLQotLyoqCi0gKiBAcGFyYW0geyFudW1iZXJ9IHZhbHVlCi0gKiBAcmV0dXJuIHshYm9vbGVh
bn0KLSAqLwotQ2FsZW5kYXJQaWNrZXIucHJvdG90eXBlLl9zdGVwTWlzbWF0Y2ggPSBmdW5jdGlv
bih2YWx1ZSkgewotICAgIHJldHVybiAodmFsdWUgLSB0aGlzLmNvbmZpZy5zdGVwQmFzZSkgJSB0
aGlzLmNvbmZpZy5zdGVwICE9IDA7Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7IW51bWJlcn0gdmFs
dWUKLSAqIEByZXR1cm4geyFib29sZWFufQotICovCi1DYWxlbmRhclBpY2tlci5wcm90b3R5cGUu
X291dE9mUmFuZ2UgPSBmdW5jdGlvbih2YWx1ZSkgewotICAgIHJldHVybiB2YWx1ZSA8IHRoaXMu
Y29uZmlnLm1pbmltdW1WYWx1ZSB8fCB2YWx1ZSA+IHRoaXMuY29uZmlnLm1heGltdW1WYWx1ZTsK
LX07Ci0KLS8qKgotICogQHBhcmFtIHshRGF0ZVR5cGV9IGRheU9yV2Vla09yTW9udGgKLSAqIEBy
ZXR1cm4geyFib29sZWFufQotICovCi1DYWxlbmRhclBpY2tlci5wcm90b3R5cGUuaXNWYWxpZCA9
IGZ1bmN0aW9uKGRheU9yV2Vla09yTW9udGgpIHsKLSAgICB2YXIgdmFsdWUgPSBkYXlPcldlZWtP
ck1vbnRoLnZhbHVlT2YoKTsKLSAgICByZXR1cm4gZGF5T3JXZWVrT3JNb250aCBpbnN0YW5jZW9m
IHRoaXMuX2RhdGVUeXBlQ29uc3RydWN0b3IgJiYgIXRoaXMuX291dE9mUmFuZ2UodmFsdWUpICYm
ICF0aGlzLl9zdGVwTWlzbWF0Y2godmFsdWUpOwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFEYXl9
IGRheQotICogQHJldHVybiB7IWJvb2xlYW59Ci0gKi8KLUNhbGVuZGFyUGlja2VyLnByb3RvdHlw
ZS5pc1ZhbGlkRGF5ID0gZnVuY3Rpb24oZGF5KSB7Ci0gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCh0
aGlzLl9kYXRlVHlwZUNvbnN0cnVjdG9yLmNyZWF0ZUZyb21EYXkoZGF5KSk7Ci19OwotCi0vKioK
LSAqIEBwYXJhbSB7IURhdGVUeXBlfSBkYXRlUmFuZ2UKLSAqIEByZXR1cm4geyFib29sZWFufSBS
ZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hsaWdodCB3YXMgY2hhbmdlZC4KLSAqLwotQ2FsZW5kYXJQ
aWNrZXIucHJvdG90eXBlLl9tb3ZlSGlnaGxpZ2h0ID0gZnVuY3Rpb24oZGF0ZVJhbmdlKSB7Ci0g
ICAgaWYgKCFkYXRlUmFuZ2UpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpcy5f
b3V0T2ZSYW5nZShkYXRlUmFuZ2UudmFsdWVPZigpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIGlmICh0aGlzLmZpcnN0VmlzaWJsZURheSgpID4gZGF0ZVJhbmdlLm1pZGRsZURheSgpIHx8
IHRoaXMubGFzdFZpc2libGVEYXkoKSA8IGRhdGVSYW5nZS5taWRkbGVEYXkoKSkKLSAgICAgICAg
dGhpcy5zZXRDdXJyZW50TW9udGgoTW9udGguY3JlYXRlRnJvbURheShkYXRlUmFuZ2UubWlkZGxl
RGF5KCkpLCBDYWxlbmRhclBpY2tlci5OYXZpZ2F0aW9uQmVoYXZpb3IuV2l0aEFuaW1hdGlvbik7
Ci0gICAgdGhpcy5fc2V0SGlnaGxpZ2h0KGRhdGVSYW5nZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19
OwotCi0vKioKLSAqIEBwYXJhbSB7P0V2ZW50fSBldmVudAotICovCi1DYWxlbmRhclBpY2tlci5w
cm90b3R5cGUub25DYWxlbmRhclRhYmxlS2V5RG93biA9IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAg
dmFyIGtleSA9IGV2ZW50LmtleUlkZW50aWZpZXI7Ci0gICAgdmFyIGV2ZW50SGFuZGxlZCA9IGZh
bHNlOwotICAgIGlmIChrZXkgPT0gIlUrMDA1NCIpIHsgLy8gJ3QnIGtleS4KLSAgICAgICAgdGhp
cy5zZWxlY3RSYW5nZUNvbnRhaW5pbmdEYXkoRGF5LmNyZWF0ZUZyb21Ub2RheSgpKTsKLSAgICAg
ICAgZXZlbnRIYW5kbGVkID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGtleSA9PSAiUGFnZVVwIikg
ewotICAgICAgICB2YXIgcHJldmlvdXNNb250aCA9IHRoaXMuY3VycmVudE1vbnRoKCkucHJldmlv
dXMoKTsKLSAgICAgICAgaWYgKHByZXZpb3VzTW9udGggJiYgcHJldmlvdXNNb250aCA+PSB0aGlz
LmNvbmZpZy5taW5pbXVtVmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudE1vbnRo
KHByZXZpb3VzTW9udGgsIENhbGVuZGFyUGlja2VyLk5hdmlnYXRpb25CZWhhdmlvci5XaXRoQW5p
bWF0aW9uKTsKLSAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAg
ICB9IGVsc2UgaWYgKGtleSA9PSAiUGFnZURvd24iKSB7Ci0gICAgICAgIHZhciBuZXh0TW9udGgg
PSB0aGlzLmN1cnJlbnRNb250aCgpLm5leHQoKTsKLSAgICAgICAgaWYgKG5leHRNb250aCAmJiBu
ZXh0TW9udGggPj0gdGhpcy5jb25maWcubWluaW11bVZhbHVlKSB7Ci0gICAgICAgICAgICB0aGlz
LnNldEN1cnJlbnRNb250aChuZXh0TW9udGgsIENhbGVuZGFyUGlja2VyLk5hdmlnYXRpb25CZWhh
dmlvci5XaXRoQW5pbWF0aW9uKTsKLSAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IHRydWU7Ci0g
ICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHRoaXMuX2hpZ2hsaWdodCkgewotICAgICAgICBpZiAo
Z2xvYmFsLnBhcmFtcy5pc0xvY2FsZVJUTCA/IGtleSA9PSAiUmlnaHQiIDoga2V5ID09ICJMZWZ0
IikgewotICAgICAgICAgICAgZXZlbnRIYW5kbGVkID0gdGhpcy5fbW92ZUhpZ2hsaWdodCh0aGlz
Ll9oaWdobGlnaHQucHJldmlvdXMoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09ICJVcCIp
IHsKLSAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IHRoaXMuX21vdmVIaWdobGlnaHQodGhpcy5f
aGlnaGxpZ2h0LnByZXZpb3VzKHRoaXMudHlwZSA9PT0gImRhdGUiID8gRGF5c1BlcldlZWsgOiAx
KSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2xvYmFsLnBhcmFtcy5pc0xvY2FsZVJUTCA/IGtleSA9
PSAiTGVmdCIgOiBrZXkgPT0gIlJpZ2h0IikgewotICAgICAgICAgICAgZXZlbnRIYW5kbGVkID0g
dGhpcy5fbW92ZUhpZ2hsaWdodCh0aGlzLl9oaWdobGlnaHQubmV4dCgpKTsKLSAgICAgICAgfSBl
bHNlIGlmIChrZXkgPT0gIkRvd24iKSB7Ci0gICAgICAgICAgICBldmVudEhhbmRsZWQgPSB0aGlz
Ll9tb3ZlSGlnaGxpZ2h0KHRoaXMuX2hpZ2hsaWdodC5uZXh0KHRoaXMudHlwZSA9PT0gImRhdGUi
ID8gRGF5c1BlcldlZWsgOiAxKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09ICJFbnRlciIp
IHsKLSAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKHRoaXMuX2hpZ2hsaWdodCk7Ci0gICAg
ICAgIH0KLSAgICB9IGVsc2UgaWYgKGtleSA9PSAiTGVmdCIgfHwga2V5ID09ICJVcCIgfHwga2V5
ID09ICJSaWdodCIgfHwga2V5ID09ICJEb3duIikgewotICAgICAgICAvLyBIaWdobGlnaHQgcmFu
Z2UgbmVhciB0aGUgbWlkZGxlLgotICAgICAgICB0aGlzLmhpZ2hsaWdodFJhbmdlQ29udGFpbmlu
Z0RheSh0aGlzLmN1cnJlbnRNb250aCgpLm1pZGRsZURheSgpKTsKLSAgICAgICAgZXZlbnRIYW5k
bGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoZXZlbnRIYW5kbGVkKSB7Ci0gICAgICAgIGV2
ZW50LnN0b3BQcm9wYWdhdGlvbigpOwotICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwot
ICAgIH0KLX07Ci0KLS8qKgotICogQHJldHVybiB7IW51bWJlcn0gV2lkdGggaW4gcGl4ZWxzLgot
ICovCi1DYWxlbmRhclBpY2tlci5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlvbigpIHsKLSAgICBy
ZXR1cm4gdGhpcy5jYWxlbmRhclRhYmxlVmlldy53aWR0aCgpICsgKENhbGVuZGFyVGFibGVWaWV3
LkJvcmRlcldpZHRoICsgQ2FsZW5kYXJQaWNrZXIuQm9yZGVyV2lkdGggKyBDYWxlbmRhclBpY2tl
ci5QYWRkaW5nKSAqIDI7Ci19OwotCi0vKioKLSAqIEByZXR1cm4geyFudW1iZXJ9IEhlaWdodCBp
biBwaXhlbHMuCi0gKi8KLUNhbGVuZGFyUGlja2VyLnByb3RvdHlwZS5oZWlnaHQgPSBmdW5jdGlv
bigpIHsKLSAgICByZXR1cm4gdGhpcy5faGVpZ2h0OwotfTsKLQotLyoqCi0gKiBAcGFyYW0geyFu
dW1iZXJ9IGhlaWdodCBIZWlnaHQgaW4gcGl4ZWxzLgotICovCi1DYWxlbmRhclBpY2tlci5wcm90
b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24oaGVpZ2h0KSB7Ci0gICAgaWYgKHRoaXMuX2hlaWdo
dCA9PT0gaGVpZ2h0KQotICAgICAgICByZXR1cm47Ci0gICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0
OwotICAgIHJlc2l6ZVdpbmRvdyh0aGlzLndpZHRoKCksIHRoaXMuX2hlaWdodCk7Ci0gICAgdGhp
cy5jYWxlbmRhclRhYmxlVmlldy5zZXRIZWlnaHQodGhpcy5faGVpZ2h0IC0gQ2FsZW5kYXJIZWFk
ZXJWaWV3LkhlaWdodCAtIENhbGVuZGFySGVhZGVyVmlldy5Cb3R0b21NYXJnaW4gLSBDYWxlbmRh
clBpY2tlci5QYWRkaW5nICogMiAtIENhbGVuZGFyVGFibGVWaWV3LkJvcmRlcldpZHRoICogMik7
Ci19OwotCi0vKioKLSAqIEBwYXJhbSB7P0V2ZW50fSBldmVudAotICovCi1DYWxlbmRhclBpY2tl
ci5wcm90b3R5cGUub25Cb2R5S2V5RG93biA9IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgdmFyIGtl
eSA9IGV2ZW50LmtleUlkZW50aWZpZXI7Ci0gICAgdmFyIGV2ZW50SGFuZGxlZCA9IGZhbHNlOwot
ICAgIHZhciBvZmZzZXQgPSAwOwotICAgIHN3aXRjaCAoa2V5KSB7Ci0gICAgY2FzZSAiVSswMDFC
IjogLy8gRXNjIGtleS4KLSAgICAgICAgd2luZG93LnBhZ2VQb3B1cENvbnRyb2xsZXIuY2xvc2VQ
b3B1cCgpOwotICAgICAgICBldmVudEhhbmRsZWQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAg
ICBjYXNlICJVKzAwNEQiOiAvLyAnbScga2V5LgotICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwg
MTsgLy8gRmFsbC10aHJvdWdoLgotICAgIGNhc2UgIlUrMDA1OSI6IC8vICd5JyBrZXkuCi0gICAg
ICAgIG9mZnNldCA9IG9mZnNldCB8fCBNb250aHNQZXJZZWFyOyAvLyBGYWxsLXRocm91Z2guCi0g
ICAgY2FzZSAiVSswMDQ0IjogLy8gJ2QnIGtleS4KLSAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8
IE1vbnRoc1BlclllYXIgKiAxMDsKLSAgICAgICAgdmFyIG9sZEZpcnN0VmlzaWJsZVJvdyA9IHRo
aXMuY2FsZW5kYXJUYWJsZVZpZXcuY29sdW1uQW5kUm93Rm9yRGF5KHRoaXMuY3VycmVudE1vbnRo
KCkuZmlyc3REYXkoKSkucm93OwotICAgICAgICB0aGlzLnNldEN1cnJlbnRNb250aChldmVudC5z
aGlmdEtleSA/IHRoaXMuY3VycmVudE1vbnRoKCkucHJldmlvdXMob2Zmc2V0KSA6IHRoaXMuY3Vy
cmVudE1vbnRoKCkubmV4dChvZmZzZXQpLCBDYWxlbmRhclBpY2tlci5OYXZpZ2F0aW9uQmVoYXZp
b3IuV2l0aEFuaW1hdGlvbik7Ci0gICAgICAgIHZhciBuZXdGaXJzdFZpc2libGVSb3cgPSB0aGlz
LmNhbGVuZGFyVGFibGVWaWV3LmNvbHVtbkFuZFJvd0ZvckRheSh0aGlzLmN1cnJlbnRNb250aCgp
LmZpcnN0RGF5KCkpLnJvdzsKLSAgICAgICAgaWYgKHRoaXMuX2hpZ2hsaWdodCkgewotICAgICAg
ICAgICAgdmFyIGhpZ2hsaWdodE1pZGRsZURheSA9IHRoaXMuX2hpZ2hsaWdodC5taWRkbGVEYXko
KTsKLSAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UmFuZ2VDb250YWluaW5nRGF5KGhpZ2hsaWdo
dE1pZGRsZURheS5uZXh0KChuZXdGaXJzdFZpc2libGVSb3cgLSBvbGRGaXJzdFZpc2libGVSb3cp
ICogRGF5c1BlcldlZWspKTsKLSAgICAgICAgfQotICAgICAgICBldmVudEhhbmRsZWQgID10cnVl
OwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGV2ZW50SGFuZGxlZCkgewotICAgICAg
ICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKLSAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQo
KTsKLSAgICB9Ci19Ci0KLWlmICh3aW5kb3cuZGlhbG9nQXJndW1lbnRzKSB7Ci0gICAgaW5pdGlh
bGl6ZShkaWFsb2dBcmd1bWVudHMpOwotfSBlbHNlIHsKLSAgICB3aW5kb3cuYWRkRXZlbnRMaXN0
ZW5lcigibWVzc2FnZSIsIGhhbmRsZU1lc3NhZ2UsIGZhbHNlKTsKLX0KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2Nzcy9odG1sLmNzcyBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9odG1sLmNzcwpp
bmRleCBkY2IyY2ExMGExYjc0Y2RiYjljMjk5NTVlMWQ0YWZiODlkMTQ1MjNjLi5mMTc4MGQ0NDA2
NWJhOWVmNmJlMTk3NGY4NmM1Yjk0ZmM4ODY5MDNhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9jc3MvaHRtbC5jc3MKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL2h0bWwuY3NzCkBAIC05MjQs
MjAgKzkyNCw2IEBAIGlucHV0W3R5cGU9ImNvbG9yIl1bbGlzdF06Oi13ZWJraXQtY29sb3Itc3dh
dGNoIHsKIAogI2VuZGlmIC8vIGRlZmluZWQoRU5BQkxFX0lOUFVUX1RZUEVfQ09MT1IpICYmIEVO
QUJMRV9JTlBVVF9UWVBFX0NPTE9SCiAKLSNpZiBkZWZpbmVkKEVOQUJMRV9DQUxFTkRBUl9QSUNL
RVIpICYmIEVOQUJMRV9DQUxFTkRBUl9QSUNLRVIKLWlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBp
Y2tlci1pbmRpY2F0b3IgewotICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgICB3aWR0aDog
MC42NmVtOwotICAgIGhlaWdodDogMC42NmVtOwotICAgIHBhZGRpbmc6IDAuMTdlbSAwLjM0ZW07
Ci0gICAgLXdlYmtpdC11c2VyLW1vZGlmeTogcmVhZC1vbmx5ICFpbXBvcnRhbnQ7Ci19Ci0KLWlu
cHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3I6aG92ZXIgewotICAgIGJhY2tn
cm91bmQtY29sb3I6ICNlZWU7Ci19Ci0jZW5kaWYgLy8gRU5BQkxFX0NBTEVOREFSX1BJQ0tFUgot
CiBzZWxlY3QgewogICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbWVudWxpc3Q7CiAgICAgYm94LXNp
emluZzogYm9yZGVyLWJveDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3Rl
eHQvTG9jYWxlSUNVLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvTG9jYWxlSUNV
LmNwcAppbmRleCA4MTEwMjk2ZDdkMTA0ZGVlMTkwYjJjMmQ5ZjU3YzBiMWNhMzFjZjVlLi5hMWU2
NTllNzA1NmQ1NzFkNTkyOGYwODQ0NTc1ZWE3Njc1YjQxNGUyIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0xvY2FsZUlDVS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vdGV4dC9Mb2NhbGVJQ1UuY3BwCkBAIC01NSw5ICs1NSw2IEBAIExvY2FsZUlDVTo6
TG9jYWxlSUNVKGNvbnN0IGNoYXIqIGxvY2FsZSkKICAgICAsIG1fc2hvcnREYXRlRm9ybWF0KDAp
CiAgICAgLCBtX2RpZENyZWF0ZURlY2ltYWxGb3JtYXQoZmFsc2UpCiAgICAgLCBtX2RpZENyZWF0
ZVNob3J0RGF0ZUZvcm1hdChmYWxzZSkKLSNpZiBFTkFCTEUoQ0FMRU5EQVJfUElDS0VSKQotICAg
ICwgbV9maXJzdERheU9mV2VlaygwKQotI2VuZGlmCiAjaWYgRU5BQkxFKERBVEVfQU5EX1RJTUVf
SU5QVVRfVFlQRVMpCiAgICAgLCBtX21lZGl1bVRpbWVGb3JtYXQoMCkKICAgICAsIG1fc2hvcnRU
aW1lRm9ybWF0KDApCkBAIC0xOTgsMzkgKzE5NSw2IEBAIFBhc3NPd25QdHI8VmVjdG9yPFN0cmlu
Zz4gPiBMb2NhbGVJQ1U6OmNyZWF0ZUxhYmVsVmVjdG9yKGNvbnN0IFVEYXRlRm9ybWF0KiBkYXRl
CiB9CiAjZW5kaWYKIAotI2lmIEVOQUJMRShDQUxFTkRBUl9QSUNLRVIpCi1zdGF0aWMgUGFzc093
blB0cjxWZWN0b3I8U3RyaW5nPiA+IGNyZWF0ZUZhbGxiYWNrV2Vla0RheVNob3J0TGFiZWxzKCkK
LXsKLSAgICBPd25QdHI8VmVjdG9yPFN0cmluZz4gPiBsYWJlbHMgPSBhZG9wdFB0cihuZXcgVmVj
dG9yPFN0cmluZz4oKSk7Ci0gICAgbGFiZWxzLT5yZXNlcnZlQ2FwYWNpdHkoNyk7Ci0gICAgbGFi
ZWxzLT5hcHBlbmQoIlN1biIpOwotICAgIGxhYmVscy0+YXBwZW5kKCJNb24iKTsKLSAgICBsYWJl
bHMtPmFwcGVuZCgiVHVlIik7Ci0gICAgbGFiZWxzLT5hcHBlbmQoIldlZCIpOwotICAgIGxhYmVs
cy0+YXBwZW5kKCJUaHUiKTsKLSAgICBsYWJlbHMtPmFwcGVuZCgiRnJpIik7Ci0gICAgbGFiZWxz
LT5hcHBlbmQoIlNhdCIpOwotICAgIHJldHVybiBsYWJlbHMucmVsZWFzZSgpOwotfQotCi12b2lk
IExvY2FsZUlDVTo6aW5pdGlhbGl6ZUNhbGVuZGFyKCkKLXsKLSAgICBpZiAobV93ZWVrRGF5U2hv
cnRMYWJlbHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghaW5pdGlhbGl6ZVNob3J0RGF0
ZUZvcm1hdCgpKSB7Ci0gICAgICAgIG1fZmlyc3REYXlPZldlZWsgPSAwOwotICAgICAgICBtX3dl
ZWtEYXlTaG9ydExhYmVscyA9IGNyZWF0ZUZhbGxiYWNrV2Vla0RheVNob3J0TGFiZWxzKCk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9maXJzdERheU9mV2VlayA9IHVjYWxfZ2V0QXR0
cmlidXRlKHVkYXRfZ2V0Q2FsZW5kYXIobV9zaG9ydERhdGVGb3JtYXQpLCBVQ0FMX0ZJUlNUX0RB
WV9PRl9XRUVLKSAtIFVDQUxfU1VOREFZOwotCi0gICAgbV93ZWVrRGF5U2hvcnRMYWJlbHMgPSBj
cmVhdGVMYWJlbFZlY3RvcihtX3Nob3J0RGF0ZUZvcm1hdCwgVURBVF9TSE9SVF9XRUVLREFZUywg
VUNBTF9TVU5EQVksIDcpOwotICAgIGlmICghbV93ZWVrRGF5U2hvcnRMYWJlbHMpCi0gICAgICAg
IG1fd2Vla0RheVNob3J0TGFiZWxzID0gY3JlYXRlRmFsbGJhY2tXZWVrRGF5U2hvcnRMYWJlbHMo
KTsKLX0KLSNlbmRpZgotCiAjaWYgRU5BQkxFKERBVEVfQU5EX1RJTUVfSU5QVVRfVFlQRVMpCiBz
dGF0aWMgUGFzc093blB0cjxWZWN0b3I8U3RyaW5nPiA+IGNyZWF0ZUZhbGxiYWNrTW9udGhMYWJl
bHMoKQogewpAQCAtMjU1LDI2ICsyMTksNiBAQCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgTG9jYWxl
SUNVOjptb250aExhYmVscygpCiB9CiAjZW5kaWYKIAotI2lmIEVOQUJMRShDQUxFTkRBUl9QSUNL
RVIpCi1jb25zdCBWZWN0b3I8U3RyaW5nPiYgTG9jYWxlSUNVOjp3ZWVrRGF5U2hvcnRMYWJlbHMo
KQotewotICAgIGluaXRpYWxpemVDYWxlbmRhcigpOwotICAgIHJldHVybiAqbV93ZWVrRGF5U2hv
cnRMYWJlbHM7Ci19Ci0KLXVuc2lnbmVkIExvY2FsZUlDVTo6Zmlyc3REYXlPZldlZWsoKQotewot
ICAgIGluaXRpYWxpemVDYWxlbmRhcigpOwotICAgIHJldHVybiBtX2ZpcnN0RGF5T2ZXZWVrOwot
fQotCi1ib29sIExvY2FsZUlDVTo6aXNSVEwoKQotewotICAgIFVFcnJvckNvZGUgc3RhdHVzID0g
VV9aRVJPX0VSUk9SOwotICAgIHJldHVybiB1bG9jX2dldENoYXJhY3Rlck9yaWVudGF0aW9uKG1f
bG9jYWxlLmRhdGEoKSwgJnN0YXR1cykgPT0gVUxPQ19MQVlPVVRfUlRMOwotfQotI2VuZGlmCi0K
ICNpZiBFTkFCTEUoREFURV9BTkRfVElNRV9JTlBVVF9UWVBFUykKIHN0YXRpYyBQYXNzT3duUHRy
PFZlY3RvcjxTdHJpbmc+ID4gY3JlYXRlRmFsbGJhY2tBTVBNTGFiZWxzKCkKIHsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvTG9jYWxlSUNVLmggYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS90ZXh0L0xvY2FsZUlDVS5oCmluZGV4IDUyMGE3N2RhMmFhZTEyN2I1ZWVl
ZDYwOTAxY2E3NDYxMGYxZDRjNTUuLjc2MDYzNzI1ZDg4MTVmMDI3YTUxNTI4MzA3MWU4NGM5NmIw
Njg1ZTIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvTG9jYWxlSUNV
LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9Mb2NhbGVJQ1UuaApAQCAtNDks
MTEgKzQ5LDYgQEAgcHVibGljOgogICAgIHN0YXRpYyBQYXNzT3duUHRyPExvY2FsZUlDVT4gY3Jl
YXRlKGNvbnN0IGNoYXIqIGxvY2FsZVN0cmluZyk7CiAgICAgdmlydHVhbCB+TG9jYWxlSUNVKCk7
CiAKLSNpZiBFTkFCTEUoQ0FMRU5EQVJfUElDS0VSKQotICAgIHZpcnR1YWwgY29uc3QgVmVjdG9y
PFN0cmluZz4mIHdlZWtEYXlTaG9ydExhYmVscygpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdW5z
aWduZWQgZmlyc3REYXlPZldlZWsoKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNSVEwo
KSBPVkVSUklERTsKLSNlbmRpZgogI2lmIEVOQUJMRShEQVRFX0FORF9USU1FX0lOUFVUX1RZUEVT
KQogICAgIHZpcnR1YWwgU3RyaW5nIGRhdGVGb3JtYXQoKSBPVkVSUklERTsKICAgICB2aXJ0dWFs
IFN0cmluZyBtb250aEZvcm1hdCgpIE9WRVJSSURFOwpAQCAtODEsMTAgKzc2LDYgQEAgcHJpdmF0
ZToKICAgICBib29sIGluaXRpYWxpemVTaG9ydERhdGVGb3JtYXQoKTsKICAgICBVRGF0ZUZvcm1h
dCogb3BlbkRhdGVGb3JtYXQoVURhdGVGb3JtYXRTdHlsZSB0aW1lU3R5bGUsIFVEYXRlRm9ybWF0
U3R5bGUgZGF0ZVN0eWxlKSBjb25zdDsKIAotI2lmIEVOQUJMRShDQUxFTkRBUl9QSUNLRVIpCi0g
ICAgdm9pZCBpbml0aWFsaXplQ2FsZW5kYXIoKTsKLSNlbmRpZgotCiAjaWYgRU5BQkxFKERBVEVf
QU5EX1RJTUVfSU5QVVRfVFlQRVMpCiAgICAgUGFzc093blB0cjxWZWN0b3I8U3RyaW5nPiA+IGNy
ZWF0ZUxhYmVsVmVjdG9yKGNvbnN0IFVEYXRlRm9ybWF0KiwgVURhdGVGb3JtYXRTeW1ib2xUeXBl
LCBpbnQzMl90IHN0YXJ0SW5kZXgsIGludDMyX3Qgc2l6ZSk7CiAgICAgdm9pZCBpbml0aWFsaXpl
RGF0ZVRpbWVGb3JtYXQoKTsKQEAgLTk2LDEwICs4Nyw2IEBAIHByaXZhdGU6CiAgICAgYm9vbCBt
X2RpZENyZWF0ZURlY2ltYWxGb3JtYXQ7CiAgICAgYm9vbCBtX2RpZENyZWF0ZVNob3J0RGF0ZUZv
cm1hdDsKIAotI2lmIEVOQUJMRShDQUxFTkRBUl9QSUNLRVIpCi0gICAgT3duUHRyPFZlY3RvcjxT
dHJpbmc+ID4gbV93ZWVrRGF5U2hvcnRMYWJlbHM7Ci0gICAgdW5zaWduZWQgbV9maXJzdERheU9m
V2VlazsKLSNlbmRpZgogI2lmIEVOQUJMRShEQVRFX0FORF9USU1FX0lOUFVUX1RZUEVTKQogICAg
IE93blB0cjxWZWN0b3I8U3RyaW5nPiA+IG1fbW9udGhMYWJlbHM7CiAgICAgU3RyaW5nIG1fZGF0
ZUZvcm1hdDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvUGxhdGZv
cm1Mb2NhbGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvUGxhdGZvcm1Mb2NhbGUu
aAppbmRleCBiOGVhMzBkODg1MWY1OWM4MjE4ODY3NmRiZTk1OTQ1MmQxNDdmZTE5Li45MjViN2Ux
MjE1YjNlMDQ1MjliOWZjNWM3MGZiZjljZWI5ZDZjMWMyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS90ZXh0L1BsYXRmb3JtTG9jYWxlLmgKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vdGV4dC9QbGF0Zm9ybUxvY2FsZS5oCkBAIC0xMTEsMjAgKzExMSw2IEBAIHB1Ymxp
YzoKICAgICB2aXJ0dWFsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBtb250aExhYmVscygpID0gMDsK
ICNlbmRpZgogCi0jaWYgRU5BQkxFKENBTEVOREFSX1BJQ0tFUikKLSAgICAvLyBSZXR1cm5zIGEg
dmVjdG9yIG9mIHN0cmluZyBvZiB3aGljaCBzaXplIGlzIDcuIFRoZSBmaXJzdCBpdGVtIGlzIGEK
LSAgICAvLyBsb2NhbGl6ZWQgc2hvcnQgc3RyaW5nIG9mIE1vbmRheSwgYW5kIHRoZSBsYXN0IGl0
ZW0gaXMgYSBsb2NhbGl6ZWQKLSAgICAvLyBzaG9ydCBzdHJpbmcgb2YgU2F0dXJkYXkuIFRoZXNl
IHN0cmluZ3Mgc2hvdWxkIGJlIHNob3J0LgotICAgIHZpcnR1YWwgY29uc3QgVmVjdG9yPFN0cmlu
Zz4mIHdlZWtEYXlTaG9ydExhYmVscygpID0gMDsKLQotICAgIC8vIFRoZSBmaXJzdCBkYXkgb2Yg
YSB3ZWVrLiAwIGlzIFN1bmRheSwgYW5kIDYgaXMgU2F0dXJkYXkuCi0gICAgdmlydHVhbCB1bnNp
Z25lZCBmaXJzdERheU9mV2VlaygpID0gMDsKLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBwZW9w
bGUgdXNlIHJpZ2h0LXRvLWxlZnQgd3JpdGluZyBpbiB0aGUgbG9jYWxlIGZvciB0aGlzCi0gICAg
Ly8gb2JqZWN0LgotICAgIHZpcnR1YWwgYm9vbCBpc1JUTCgpID0gMDsKLSNlbmRpZgotCiAjaWYg
RU5BQkxFKERBVEVfQU5EX1RJTUVfSU5QVVRfVFlQRVMpCiAgICAgZW51bSBGb3JtYXRUeXBlIHsg
Rm9ybWF0VHlwZVVuc3BlY2lmaWVkLCBGb3JtYXRUeXBlU2hvcnQsIEZvcm1hdFR5cGVNZWRpdW0g
fTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9tYWMvTG9jYWxl
TWFjLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L21hYy9Mb2NhbGVNYWMuaAppbmRl
eCA0NGYyMzRmZDBmOWRkOGVmYzIwYzI4NTliYmI0ZjljNzk4NDUzNjU3Li43MDc0OTAzZjQyZDFm
NmU4MjNkOGQ0NGNhOGI5MDdkZTcxODIyYjk2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS90ZXh0L21hYy9Mb2NhbGVNYWMuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS90ZXh0L21hYy9Mb2NhbGVNYWMuaApAQCAtNTEsMTIgKzUxLDYgQEAgcHVibGljOgogICAgIHN0
YXRpYyBQYXNzT3duUHRyPExvY2FsZU1hYz4gY3JlYXRlKE5TTG9jYWxlKik7CiAgICAgfkxvY2Fs
ZU1hYygpOwogCi0jaWYgRU5BQkxFKENBTEVOREFSX1BJQ0tFUikKLSAgICB2aXJ0dWFsIGNvbnN0
IFZlY3RvcjxTdHJpbmc+JiB3ZWVrRGF5U2hvcnRMYWJlbHMoKSBPVkVSUklERTsKLSAgICB2aXJ0
dWFsIHVuc2lnbmVkIGZpcnN0RGF5T2ZXZWVrKCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBib29s
IGlzUlRMKCkgT1ZFUlJJREU7Ci0jZW5kaWYKLQogI2lmIEVOQUJMRShEQVRFX0FORF9USU1FX0lO
UFVUX1RZUEVTKQogICAgIHZpcnR1YWwgU3RyaW5nIGRhdGVGb3JtYXQoKSBPVkVSUklERTsKICAg
ICB2aXJ0dWFsIFN0cmluZyBtb250aEZvcm1hdCgpIE9WRVJSSURFOwpAQCAtNzksOSArNzMsNiBA
QCBwcml2YXRlOgogCiAgICAgUmV0YWluUHRyPE5TTG9jYWxlPiBtX2xvY2FsZTsKICAgICBSZXRh
aW5QdHI8TlNDYWxlbmRhcj4gbV9ncmVnb3JpYW5DYWxlbmRhcjsKLSNpZiBFTkFCTEUoQ0FMRU5E
QVJfUElDS0VSKQotICAgIFZlY3RvcjxTdHJpbmc+IG1fd2Vla0RheVNob3J0TGFiZWxzOwotI2Vu
ZGlmCiAjaWYgRU5BQkxFKERBVEVfQU5EX1RJTUVfSU5QVVRfVFlQRVMpCiAgICAgVmVjdG9yPFN0
cmluZz4gbV9tb250aExhYmVsczsKICAgICBSZXRhaW5QdHI8TlNEYXRlRm9ybWF0dGVyPiB0aW1l
Rm9ybWF0dGVyKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L21h
Yy9Mb2NhbGVNYWMubW0gYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L21hYy9Mb2NhbGVN
YWMubW0KaW5kZXggYTIzZjk4Mzg3Yjk2ZGEyNzIxN2E1YzMzNTcyYzFmNWEzZTlhYTFkOC4uNjM2
NmE0MDgxODNiNjEzMzE0YjhiODM5OWMxZTdhYTIwYTJlYWJlOCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9tYWMvTG9jYWxlTWFjLm1tCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL3RleHQvbWFjL0xvY2FsZU1hYy5tbQpAQCAtMTMwLDQyICsxMzAsNyBAQCBj
b25zdCBWZWN0b3I8U3RyaW5nPiYgTG9jYWxlTWFjOjptb250aExhYmVscygpCiAgICAgICAgIG1f
bW9udGhMYWJlbHMuYXBwZW5kKFdURjo6bW9udGhGdWxsTmFtZVtpXSk7CiAgICAgcmV0dXJuIG1f
bW9udGhMYWJlbHM7CiB9Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShDQUxFTkRBUl9QSUNLRVIpCi1j
b25zdCBWZWN0b3I8U3RyaW5nPiYgTG9jYWxlTWFjOjp3ZWVrRGF5U2hvcnRMYWJlbHMoKQotewot
ICAgIGlmICghbV93ZWVrRGF5U2hvcnRMYWJlbHMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4g
bV93ZWVrRGF5U2hvcnRMYWJlbHM7Ci0gICAgbV93ZWVrRGF5U2hvcnRMYWJlbHMucmVzZXJ2ZUNh
cGFjaXR5KDcpOwotICAgIE5TQXJyYXkgKmFycmF5ID0gW3Nob3J0RGF0ZUZvcm1hdHRlcigpLmdl
dCgpIHNob3J0V2Vla2RheVN5bWJvbHNdOwotICAgIGlmIChbYXJyYXkgY291bnRdID09IDcpIHsK
LSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDc7ICsraSkKLSAgICAgICAgICAgIG1f
d2Vla0RheVNob3J0TGFiZWxzLmFwcGVuZChTdHJpbmcoW2FycmF5IG9iamVjdEF0SW5kZXg6aV0p
KTsKLSAgICAgICAgcmV0dXJuIG1fd2Vla0RheVNob3J0TGFiZWxzOwotICAgIH0KLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdUSChXVEY6OndlZWtkYXlOYW1lKTsg
KytpKSB7Ci0gICAgICAgIC8vIHdlZWtkYXlOYW1lIHN0YXJ0cyB3aXRoIE1vbmRheS4KLSAgICAg
ICAgbV93ZWVrRGF5U2hvcnRMYWJlbHMuYXBwZW5kKFdURjo6d2Vla2RheU5hbWVbKGkgKyA2KSAl
IDddKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fd2Vla0RheVNob3J0TGFiZWxzOwotfQotCi11bnNp
Z25lZCBMb2NhbGVNYWM6OmZpcnN0RGF5T2ZXZWVrKCkKLXsKLSAgICAvLyBUaGUgZG9jdW1lbnQg
Zm9yIE5TQ2FsZW5kYXIgLSBmaXJzdFdlZWtkYXkgZG9lc24ndCBoYXZlIGFuIGV4cGxhbmF0aW9u
IG9mCi0gICAgLy8gZmlyc3RXZWVrZGF5IHZhbHVlLiBXZSBjYW4gZ3Vlc3MgaXQgYnkgdGhlIGRv
Y3VtZW50IG9mIE5TRGF0ZUNvbXBvbmVudHMgLQotICAgIC8vIHdlZWtEYXksIHNvIGl0IGNhbiBi
ZSAxIHRocm91Z2ggNyBhbmQgMSBpcyBTdW5kYXkuCi0gICAgcmV0dXJuIFttX2dyZWdvcmlhbkNh
bGVuZGFyLmdldCgpIGZpcnN0V2Vla2RheV0gLSAxOwotfQogCi1ib29sIExvY2FsZU1hYzo6aXNS
VEwoKQotewotICAgIHJldHVybiBOU0xvY2FsZUxhbmd1YWdlRGlyZWN0aW9uUmlnaHRUb0xlZnQg
PT0gW05TTG9jYWxlIGNoYXJhY3RlckRpcmVjdGlvbkZvckxhbmd1YWdlOltOU0xvY2FsZSBjYW5v
bmljYWxMYW5ndWFnZUlkZW50aWZpZXJGcm9tU3RyaW5nOlttX2xvY2FsZS5nZXQoKSBsb2NhbGVJ
ZGVudGlmaWVyXV1dOwotfQotI2VuZGlmCi0KLSNpZiBFTkFCTEUoREFURV9BTkRfVElNRV9JTlBV
VF9UWVBFUykKIFJldGFpblB0cjxOU0RhdGVGb3JtYXR0ZXI+IExvY2FsZU1hYzo6dGltZUZvcm1h
dHRlcigpCiB7CiAgICAgcmV0dXJuIGNyZWF0ZURhdGVUaW1lRm9ybWF0dGVyKG1fbG9jYWxlLmdl
dCgpLCBtX2dyZWdvcmlhbkNhbGVuZGFyLmdldCgpLCBOU0RhdGVGb3JtYXR0ZXJOb1N0eWxlLCBO
U0RhdGVGb3JtYXR0ZXJNZWRpdW1TdHlsZSk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS90ZXh0L3dpbi9Mb2NhbGVXaW4uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
dGV4dC93aW4vTG9jYWxlV2luLmNwcAppbmRleCBlZGUyNzBjNjI5YTVjMzZiNzM4NWUwYzUyMmZl
MDIzNjQ3MDAzNDQwLi44OTYwOGUyMGI5YjBkYTYzOTI3NTE5OGRiM2NhNWFiNTg3NWUzNzM3IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbi9Mb2NhbGVXaW4uY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvd2luL0xvY2FsZVdpbi5jcHAKQEAg
LTE1NiwxMyArMTU2LDYgQEAgaW5saW5lIExvY2FsZVdpbjo6TG9jYWxlV2luKExDSUQgbGNpZCkK
ICAgICA6IG1fbGNpZChsY2lkKQogICAgICwgbV9kaWRJbml0aWFsaXplTnVtYmVyRGF0YShmYWxz
ZSkKIHsKLSNpZiBFTkFCTEUoQ0FMRU5EQVJfUElDS0VSKQotICAgIERXT1JEIHZhbHVlID0gMDsK
LSAgICBnZXRMb2NhbGVJbmZvKExPQ0FMRV9JRklSU1REQVlPRldFRUssIHZhbHVlKTsKLSAgICAv
LyAwOk1vbmRheSwgLi4uLCA2OlN1bmRheS4KLSAgICAvLyBXZSBuZWVkIDEgZm9yIE1vbmRheSwg
MCBmb3IgU3VuZGF5LgotICAgIG1fZmlyc3REYXlPZldlZWsgPSAodmFsdWUgKyAxKSAlIDc7Ci0j
ZW5kaWYKIH0KIAogUGFzc093blB0cjxMb2NhbGVXaW4+IExvY2FsZVdpbjo6Y3JlYXRlKExDSUQg
bGNpZCkKQEAgLTM1OCw2NCArMzUxLDEzIEBAIHZvaWQgTG9jYWxlV2luOjplbnN1cmVNb250aExh
YmVscygpCiAjZW5kaWYKIH0KIAotI2lmIEVOQUJMRShDQUxFTkRBUl9QSUNLRVIpCi12b2lkIExv
Y2FsZVdpbjo6ZW5zdXJlV2Vla0RheVNob3J0TGFiZWxzKCkKLXsKLSAgICBpZiAoIW1fd2Vla0Rh
eVNob3J0TGFiZWxzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGNvbnN0IExDVFlQ
RSB0eXBlc1s3XSA9IHsKLSAgICAgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywgLy8gU3VuZGF5
Ci0gICAgICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIC8vIE1vbmRheQotICAgICAgICBMT0NB
TEVfU0FCQlJFVkRBWU5BTUUyLAotICAgICAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLAotICAg
ICAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LAotICAgICAgICBMT0NBTEVfU0FCQlJFVkRBWU5B
TUU1LAotICAgICAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUU2Ci0gICAgfTsKLSAgICBtX3dlZWtE
YXlTaG9ydExhYmVscy5yZXNlcnZlQ2FwYWNpdHkoV1RGX0FSUkFZX0xFTkdUSCh0eXBlcykpOwot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKHR5cGVzKTsgKytp
KSB7Ci0gICAgICAgIG1fd2Vla0RheVNob3J0TGFiZWxzLmFwcGVuZChnZXRMb2NhbGVJbmZvU3Ry
aW5nKHR5cGVzW2ldKSk7Ci0gICAgICAgIGlmIChtX3dlZWtEYXlTaG9ydExhYmVscy5sYXN0KCku
aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtX3dlZWtEYXlTaG9ydExhYmVscy5zaHJpbmsoMCk7
Ci0gICAgICAgICAgICBtX3dlZWtEYXlTaG9ydExhYmVscy5yZXNlcnZlQ2FwYWNpdHkoV1RGX0FS
UkFZX0xFTkdUSChXVEY6OndlZWtkYXlOYW1lKSk7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IHcgPSAwOyB3IDwgV1RGX0FSUkFZX0xFTkdUSChXVEY6OndlZWtkYXlOYW1lKTsgKyt3KSB7Ci0g
ICAgICAgICAgICAgICAgLy8gd2Vla2RheU5hbWUgc3RhcnRzIHdpdGggTW9uZGF5LgotICAgICAg
ICAgICAgICAgIG1fd2Vla0RheVNob3J0TGFiZWxzLmFwcGVuZChXVEY6OndlZWtkYXlOYW1lWyh3
ICsgNikgJSA3XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLSAgICB9Ci19Ci0jZW5kaWYKLQogI2lmIEVOQUJMRShEQVRFX0FORF9USU1FX0lOUFVUX1RZ
UEVTKQogY29uc3QgVmVjdG9yPFN0cmluZz4mIExvY2FsZVdpbjo6bW9udGhMYWJlbHMoKQogewog
ICAgIGVuc3VyZU1vbnRoTGFiZWxzKCk7CiAgICAgcmV0dXJuIG1fbW9udGhMYWJlbHM7CiB9Ci0j
ZW5kaWYKIAotI2lmIEVOQUJMRShDQUxFTkRBUl9QSUNLRVIpCi1jb25zdCBWZWN0b3I8U3RyaW5n
PiYgTG9jYWxlV2luOjp3ZWVrRGF5U2hvcnRMYWJlbHMoKQotewotICAgIGVuc3VyZVdlZWtEYXlT
aG9ydExhYmVscygpOwotICAgIHJldHVybiBtX3dlZWtEYXlTaG9ydExhYmVsczsKLX0KLQotdW5z
aWduZWQgTG9jYWxlV2luOjpmaXJzdERheU9mV2VlaygpCi17Ci0gICAgcmV0dXJuIG1fZmlyc3RE
YXlPZldlZWs7Ci19Ci0KLWJvb2wgTG9jYWxlV2luOjppc1JUTCgpCi17Ci0gICAgV1RGOjpVbmlj
b2RlOjpEaXJlY3Rpb24gZGlyID0gV1RGOjpVbmljb2RlOjpkaXJlY3Rpb24obW9udGhMYWJlbHMo
KVswXVswXSk7Ci0gICAgcmV0dXJuIGRpciA9PSBXVEY6OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0IHx8
IGRpciA9PSBXVEY6OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0QXJhYmljOwotfQotI2VuZGlmCi0KLSNp
ZiBFTkFCTEUoREFURV9BTkRfVElNRV9JTlBVVF9UWVBFUykKIFN0cmluZyBMb2NhbGVXaW46OmRh
dGVGb3JtYXQoKQogewogICAgIGlmIChtX2RhdGVGb3JtYXQuaXNOdWxsKCkpCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbi9Mb2NhbGVXaW4uaCBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL3RleHQvd2luL0xvY2FsZVdpbi5oCmluZGV4IDNjY2MzZTM5NmU1Yjg3
OGQ2OTYwMzk5Zjg1ZjMxYTE3NDgxZDVjYmUuLjdhYjBiZTNjYTdiMjZmZjRhYzA0NDFiNzVkYTEz
NjhjZDc0NjgzNGUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvd2lu
L0xvY2FsZVdpbi5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvd2luL0xvY2Fs
ZVdpbi5oCkBAIC00NiwxMSArNDYsNiBAQCBjbGFzcyBMb2NhbGVXaW4gOiBwdWJsaWMgTG9jYWxl
IHsKIHB1YmxpYzoKICAgICBzdGF0aWMgUGFzc093blB0cjxMb2NhbGVXaW4+IGNyZWF0ZShMQ0lE
KTsKICAgICB+TG9jYWxlV2luKCk7Ci0jaWYgRU5BQkxFKENBTEVOREFSX1BJQ0tFUikKLSAgICB2
aXJ0dWFsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiB3ZWVrRGF5U2hvcnRMYWJlbHMoKSBPVkVSUklE
RTsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGZpcnN0RGF5T2ZXZWVrKCkgT1ZFUlJJREU7Ci0gICAg
dmlydHVhbCBib29sIGlzUlRMKCkgT1ZFUlJJREU7Ci0jZW5kaWYKICNpZiBFTkFCTEUoREFURV9B
TkRfVElNRV9JTlBVVF9UWVBFUykKICAgICB2aXJ0dWFsIFN0cmluZyBkYXRlRm9ybWF0KCkgT1ZF
UlJJREU7CiAgICAgdmlydHVhbCBTdHJpbmcgbW9udGhGb3JtYXQoKSBPVkVSUklERTsKQEAgLTc0
LDkgKzY5LDYgQEAgcHJpdmF0ZToKICAgICB2b2lkIGdldExvY2FsZUluZm8oTENUWVBFLCBEV09S
RCYpOwogICAgIHZvaWQgZW5zdXJlU2hvcnRNb250aExhYmVscygpOwogICAgIHZvaWQgZW5zdXJl
TW9udGhMYWJlbHMoKTsKLSNpZiBFTkFCTEUoQ0FMRU5EQVJfUElDS0VSKQotICAgIHZvaWQgZW5z
dXJlV2Vla0RheVNob3J0TGFiZWxzKCk7Ci0jZW5kaWYKICAgICAvLyBMb2NhbGUgZnVuY3Rpb246
CiAgICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVMb2NhbGVEYXRhKCkgT1ZFUlJJREU7CiAKQEAg
LTkzLDEwICs4NSw2IEBAIHByaXZhdGU6CiAgICAgU3RyaW5nIG1fZGF0ZVRpbWVGb3JtYXRXaXRo
b3V0U2Vjb25kczsKICAgICBWZWN0b3I8U3RyaW5nPiBtX3RpbWVBTVBNTGFiZWxzOwogI2VuZGlm
Ci0jaWYgRU5BQkxFKENBTEVOREFSX1BJQ0tFUikKLSAgICBWZWN0b3I8U3RyaW5nPiBtX3dlZWtE
YXlTaG9ydExhYmVsczsKLSAgICB1bnNpZ25lZCBtX2ZpcnN0RGF5T2ZXZWVrOwotI2VuZGlmCiAg
ICAgYm9vbCBtX2RpZEluaXRpYWxpemVOdW1iZXJEYXRhOwogfTsKIApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0Fib3V0RGF0YUVuYWJsZUZlYXR1
cmVzLmluIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0Fib3V0RGF0
YUVuYWJsZUZlYXR1cmVzLmluCmluZGV4IDg1MzViZDRiM2MwMjRjNzU3NWU1NDQxNzkzYWIxYjFj
ODdhM2FjNmUuLmMyMDUyM2NmNGJmNzYzMGQ4ZmYxNmIxMGQwZTdiNjVkNTgwZmY1ZDUgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9BYm91dERhdGFF
bmFibGVGZWF0dXJlcy5pbgorKysgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViQ29yZVN1
cHBvcnQvQWJvdXREYXRhRW5hYmxlRmVhdHVyZXMuaW4KQEAgLTE0LDcgKzE0LDYgQEAgQkxPQgog
QlJBTkNIX0NPTVBBQ1RJT04KIEJZVEVDT0RFX0NPTU1FTlRTCiBDQUNIRV9QQVJUSVRJT05JTkcK
LUNBTEVOREFSX1BJQ0tFUgogQ0FOVkFTX1BBVEgKIENBTlZBU19QUk9YWQogQ0hBTk5FTF9NRVNT
QUdJTkcK
</data>

          </attachment>
      

    </bug>

</bugzilla>