URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Submission Tags: phishing malicious Search All
Submission: On September 29 via api from US

Summary

This website contacted 76 IPs in 7 countries across 63 domains to perform 241 HTTP transactions. The main IP is 178.19.72.10, located in Germany and belongs to HGCOMP-ASN, DE. The main domain is www.giga.de.
TLS certificate: Issued by RapidSSL RSA CA 2018 on July 18th 2018. Valid for: 2 years.
This is the only time www.giga.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
15 178.19.72.10 29551 (HGCOMP-ASN)
1 151.101.14.217 54113 (FASTLY)
1 91.215.100.39 43407 (INFONLINE-AS)
1 46.253.113.178 29551 (HGCOMP-ASN)
9 178.19.70.100 29551 (HGCOMP-ASN)
6 2a00:1450:400... 15169 (GOOGLE)
3 188.40.16.106 24940 (HETZNER-AS)
1 2 161.156.66.178 36351 (SOFTLAYER)
1 2 2a03:2880:f12... 32934 (FACEBOOK)
1 2a03:2880:f02... 32934 (FACEBOOK)
14 2a00:1450:400... 15169 (GOOGLE)
4 52.222.151.91 16509 (AMAZON-02)
4 107.178.241.34 15169 (GOOGLE)
1 193.46.63.75 43407 (INFONLINE-AS)
2 3 91.215.100.40 43407 (INFONLINE-AS)
6 109.71.25.30 29551 (HGCOMP-ASN)
3 178.19.72.20 29551 (HGCOMP-ASN)
4 12 104.109.82.87 20940 (AKAMAI-ASN1)
1 16 216.58.210.2 15169 (GOOGLE)
1 143.204.214.51 16509 (AMAZON-02)
1 2.18.233.67 16625 (AKAMAI-AS)
1 2 80.82.201.88 48173 (UNBELIEVA...)
1 35.156.29.62 16509 (AMAZON-02)
1 2600:9000:214... 16509 (AMAZON-02)
9 2a00:1450:400... 15169 (GOOGLE)
3 2a00:1450:400... 15169 (GOOGLE)
1 178.19.65.130 29551 (HGCOMP-ASN)
1 2a00:1450:400... 15169 (GOOGLE)
6 151.101.114.2 54113 (FASTLY)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
2 52.219.73.195 16509 (AMAZON-02)
3 143.204.214.52 16509 (AMAZON-02)
3 2a00:1450:400... 15169 (GOOGLE)
1 2 52.94.220.16 16509 (AMAZON-02)
2 2606:4700:20:... 13335 (CLOUDFLAR...)
2 151.101.13.194 54113 (FASTLY)
2 34.95.120.147 15169 (GOOGLE)
4 37.252.173.27 29990 (ASN-APPNEXUS)
1 37.157.4.24 198622 (ADFORM)
7 185.22.221.117 60955 (WAVECON)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 104.111.246.233 16625 (AKAMAI-AS)
2 8 35.190.94.1 15169 (GOOGLE)
2 146.148.127.183 15169 (GOOGLE)
3 62.168.44.125 5588 (GTSCE GTS...)
2 7 2.18.234.72 16625 (AKAMAI-AS)
4 144.76.9.6 24940 (HETZNER-AS)
2 18.196.191.159 16509 (AMAZON-02)
11 2.18.232.7 16625 (AKAMAI-AS)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
2 6 104.111.214.103 16625 (AKAMAI-AS)
4 12 151.101.14.2 54113 (FASTLY)
2 151.101.114.49 54113 (FASTLY)
2 2 18.194.102.89 16509 (AMAZON-02)
1 69.173.144.136 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
3 3 172.217.21.194 15169 (GOOGLE)
4 151.101.14.49 54113 (FASTLY)
2 2 54.154.79.134 16509 (AMAZON-02)
1 1 54.70.1.117 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 130.211.13.252 15169 (GOOGLE)
3 3 35.156.148.74 16509 (AMAZON-02)
2 2 35.244.211.12 15169 (GOOGLE)
1 2.18.233.180 16625 (AKAMAI-AS)
1 151.101.113.108 54113 (FASTLY)
1 104.108.40.167 16625 (AKAMAI-AS)
3 136.243.4.14 24940 (HETZNER-AS)
1 52.28.148.3 16509 (AMAZON-02)
1 2.16.122.151 20940 (AKAMAI-ASN1)
1 89.163.159.117 24961 (MYLOC-AS)
1 194.213.222.29 5588 (GTSCE GTS...)
4 54.246.164.155 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 143.204.214.22 16509 (AMAZON-02)
1 2600:9000:214... 16509 (AMAZON-02)
1 89.163.159.124 24961 (MYLOC-AS)
1 2600:9000:214... 16509 (AMAZON-02)
1 34.250.43.132 16509 (AMAZON-02)
1 1 89.163.159.110 24961 (MYLOC-AS)
1 34.248.95.73 16509 (AMAZON-02)
241 76
Apex Domain
Subdomains
Transfer
33 giga.de
www.giga.de
static.giga.de
crops.giga.de
videos.giga.de
ssl.1.damoh.giga.de
534 KB
25 taboola.com
cdn.taboola.com
trc.taboola.com
15.taboola.com
match.taboola.com
cds.taboola.com
vidstat.taboola.com
imprammp.taboola.com
372 KB
22 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
cm.g.doubleclick.net
201 KB
14 google-analytics.com
www.google-analytics.com
43 KB
13 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
8 KB
11 teads.tv
a.teads.tv
t.teads.tv
sync.teads.tv
188 KB
8 ad4m.at
ad4m.at
29 KB
8 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
120 KB
7 adscale.de
native.adscale.de
js.adscale.de
ih.adscale.de
13 KB
7 oadts.com
media.oadts.com
122 KB
7 googletagservices.com
www.googletagservices.com
187 KB
6 scorecardresearch.com
sb.scorecardresearch.com
4 KB
6 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
21 KB
6 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
26 KB
5 adnxs.com
ib.adnxs.com
acdn.adnxs.com
3 KB
5 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
14 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 ibillboard.com
video-adserver.ibillboard.com
tracker-adserver.ibillboard.com
bbcdn-bbnaut.ibillboard.com
3 KB
4 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
82 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 meetrics.net
lb97.s400.meetrics.net
907 B
3 bidswitch.net
x.bidswitch.net
1 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
62 KB
3 nuggad.net
si.nuggad.net
adscale.nuggad.net
ap-sync.nuggad.net
2 KB
3 giga-abs.de
go.giga-abs.de
2 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 metadsp.co.uk
u.ipw.metadsp.co.uk
868 B
2 adsrvr.org
match.adsrvr.org
892 B
2 mfadsrvr.com
rtb.mfadsrvr.com
1 KB
2 consensu.org
cmp.teads.mgr.consensu.org
2 yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
591 B
2 ad4mat.net
ad4mat.net
2 rubiconproject.com
fastlane.rubiconproject.com Failed
pixel.rubiconproject.com
eus.rubiconproject.com
239 B
2 openx.net
yieldlove-d.openx.net
eu-u.openx.net
5 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
23 KB
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
119 KB
2 google.com
adservice.google.com
apis.google.com
18 KB
2 google.de
adservice.google.de
349 B
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 facebook.com
www.facebook.com
540 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 userreport.com
sak.userreport.com
18 KB
1 mookie1.com
de-gmtdmp.mookie1.com
495 B
1 yieldlab.net
ad.yieldlab.net
495 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
450 B
1 powerlinks.com
px.powerlinks.com
402 B
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
343 B
1 adform.net
adx.adform.net
410 B
1 pubmatic.com
hbopenbid.pubmatic.com Failed
ads.pubmatic.com
1 giga-video.de
files.giga-video.de
30 KB
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 dkuim.de
dkuim.de
151 KB
1 dunkirkinception.com
www.dunkirkinception.com
436 B
1 mxcdn.net
s400.mxcdn.net
48 KB
1 yieldlove.com
cdn-a.yieldlove.com
89 KB
1 atdmt.com
cx.atdmt.com
408 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
0 otto.de Failed
orbidder.otto.de Failed
0 casalemedia.com Failed
as-sec.casalemedia.com Failed
0 smartadserver.com Failed
prg.smartadserver.com Failed
241 63
Domain Requested by
16 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.giga.de
www.googletagservices.com
15 www.giga.de www.giga.de
js.stroeermediabrands.de
14 www.google-analytics.com www.giga.de
www.google-analytics.com
12 tracking.m6r.eu 4 redirects www.giga.de
media.oadts.com
confiant-integrations.global.ssl.fastly.net
9 trc.taboola.com 4 redirects cdn.taboola.com
www.giga.de
8 ad4m.at 2 redirects securepubads.g.doubleclick.net
ad4m.at
7 media.oadts.com www.giga.de
media.oadts.com
7 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
7 static.giga.de www.giga.de
6 t.teads.tv www.giga.de
6 sb.scorecardresearch.com 2 redirects www.giga.de
cdn.taboola.com
6 cdn.taboola.com www.giga.de
cdn.taboola.com
6 videos.giga.de www.giga.de
videos.giga.de
text
5 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
4 match.taboola.com www.giga.de
4 a.teads.tv www.giga.de
confiant-integrations.global.ssl.fastly.net
a.teads.tv
4 ih.adscale.de 1 redirects js.adscale.de
www.giga.de
4 ssl.1.damoh.giga.de text
4 ib.adnxs.com cdn-a.yieldlove.com
www.giga.de
4 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
3 lb97.s400.meetrics.net www.giga.de
3 vidstat.taboola.com confiant-integrations.global.ssl.fastly.net
3 x.bidswitch.net 3 redirects
3 cm.g.doubleclick.net 3 redirects
3 tpc.googlesyndication.com securepubads.g.doubleclick.net
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 go.giga-abs.de www.giga.de
3 de.ioam.de 2 redirects www.giga.de
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 uss.xplosion.de www.giga.de
2 ups.xplosion.de confiant-integrations.global.ssl.fastly.net
cdn.emetriq.de
2 u.ipw.metadsp.co.uk 2 redirects
2 match.adsrvr.org 2 redirects
2 rtb.mfadsrvr.com 2 redirects
2 cmp.teads.mgr.consensu.org confiant-integrations.global.ssl.fastly.net
2 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
2 t.nativendo.de confiant-integrations.global.ssl.fastly.net
2 js.adscale.de confiant-integrations.global.ssl.fastly.net
2 video-adserver.ibillboard.com media.oadts.com
2 ad4mat.net ad4m.at
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 c.nativendo.de d.nativendo.de
c.nativendo.de
2 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 adservice.google.de pagead2.googlesyndication.com
www.googletagservices.com
2 d.nativendo.de www.giga.de
c.nativendo.de
2 www.facebook.com 1 redirects www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
1 adstax-match.adrtx.net confiant-integrations.global.ssl.fastly.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.giga.de
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 ap-sync.nuggad.net
1 sak.userreport.com si.nuggad.net
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com confiant-integrations.global.ssl.fastly.net
1 dmp.theadex.com confiant-integrations.global.ssl.fastly.net
1 ad.yieldlab.net www.giga.de
1 d.agkn.com js.agkn.com
1 cdn.m6r.eu 1 redirects
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 acdn.adnxs.com cdn-a.yieldlove.com
1 ads.pubmatic.com cdn-a.yieldlove.com
1 eu-u.openx.net cdn-a.yieldlove.com
1 imprammp.taboola.com confiant-integrations.global.ssl.fastly.net
1 cds.taboola.com www.giga.de
1 bttrack.com www.giga.de
1 www.storygize.net 1 redirects
1 px.powerlinks.com 1 redirects
1 pixel.rubiconproject.com www.giga.de
1 15.taboola.com confiant-integrations.global.ssl.fastly.net
1 sync.teads.tv confiant-integrations.global.ssl.fastly.net
1 tracker-adserver.ibillboard.com www.giga.de
1 adscale.nuggad.net 1 redirects
1 native.adscale.de c.nativendo.de
1 cdn.stroeerdigitalmedia.de www.giga.de
1 adx.adform.net cdn-a.yieldlove.com
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 files.giga-video.de www.giga.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 ajax.googleapis.com www.giga.de
1 imasdk.googleapis.com videos.giga.de
1 apis.google.com www.giga.de
1 dkuim.de www.giga.de
1 adservice.google.com pagead2.googlesyndication.com
1 js.agkn.com js.stroeermediabrands.de
1 www.dunkirkinception.com www.giga.de
1 si.nuggad.net js.stroeermediabrands.de
1 s400.mxcdn.net js.stroeermediabrands.de
1 cdn-a.yieldlove.com js.stroeermediabrands.de
1 irqs.ioam.de script.ioam.de
1 cx.atdmt.com www.giga.de
1 crops.giga.de www.giga.de
1 js.stroeermediabrands.de www.giga.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
0 orbidder.otto.de Failed cdn-a.yieldlove.com
0 fastlane.rubiconproject.com Failed cdn-a.yieldlove.com
0 hbopenbid.pubmatic.com Failed cdn-a.yieldlove.com
0 as-sec.casalemedia.com Failed cdn-a.yieldlove.com
0 prg.smartadserver.com Failed cdn-a.yieldlove.com
241 103
Subject Issuer Validity Valid
*.giga.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-02
2 years crt.sh
a3.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-09-26 -
2020-09-10
a year crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.stroeermediabrands.de
RapidSSL RSA CA 2018
2018-09-06 -
2020-12-05
2 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
*.met.vgwort.de
Thawte RSA CA 2018
2018-05-22 -
2020-03-25
2 years crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2019-08-24 -
2019-10-19
2 months crt.sh
*.atlassolutions.com
DigiCert SHA2 High Assurance Server CA
2019-07-11 -
2019-10-09
3 months crt.sh
*.google-analytics.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
c.amazon-adsystem.com
Amazon
2018-12-18 -
2019-11-21
a year crt.sh
*.nativendo.de
Thawte TLS RSA CA G1
2019-04-30 -
2021-05-29
2 years crt.sh
*.giga-abs.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-09-04
2 years crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
cdn-a.yieldlove.com
Amazon
2018-10-11 -
2019-11-11
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2018-09-27 -
2019-11-26
a year crt.sh
*.nuggad.net
Gandi Standard SSL CA 2
2018-01-12 -
2020-01-16
2 years crt.sh
www.dunkirkinception.com
Amazon
2019-05-22 -
2020-06-22
a year crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
*.google.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
*.dkuim.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-03
2 years crt.sh
*.apis.google.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-07-30 -
2020-07-25
a year crt.sh
*.googleapis.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-01-01
a year crt.sh
*.s3.eu-central-1.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-09-06 -
2020-12-10
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
aax-eu.amazon-adsystem.com
Amazon
2019-09-18 -
2020-08-26
a year crt.sh
ssl379338.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-05-06 -
2019-11-12
6 months crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.adform.net
DigiCert SHA2 Secure Server CA
2019-03-25 -
2020-04-29
a year crt.sh
*.oadts.com
RapidSSL TLS RSA CA G1
2018-05-02 -
2020-06-30
2 years crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
*.adscale.de
DigiCert SHA2 Secure Server CA
2019-02-19 -
2020-05-20
a year crt.sh
*.ad4m.at
AlphaSSL CA - SHA256 - G2
2017-09-13 -
2020-09-13
3 years crt.sh
*.ad4mat.net
AlphaSSL CA - SHA256 - G2
2019-08-06 -
2021-09-08
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2019-09-04 -
2019-12-03
3 months crt.sh
api.yieldlove-ad-serving.net
Let's Encrypt Authority X3
2019-08-15 -
2019-11-13
3 months crt.sh
teads.tv
Let's Encrypt Authority X3
2019-08-22 -
2019-11-20
3 months crt.sh
teads.mgr.consensu.org
Let's Encrypt Authority X3
2019-09-23 -
2019-12-22
3 months crt.sh
*.scorecardresearch.com
COMODO RSA Organization Validation Secure Server CA
2018-11-28 -
2019-12-26
a year crt.sh
g2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-03 -
2019-11-19
7 months crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.bttrack.com
Sectigo RSA Domain Validation Secure Server CA
2019-03-19 -
2021-04-13
2 years crt.sh
*.taboola.com
DigiCert ECC Secure Server CA
2019-09-03 -
2020-09-10
a year crt.sh
*.pubmatic.com
DigiCert SHA2 Secure Server CA
2018-12-13 -
2020-03-13
a year crt.sh
cdn.adnxs.com
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-16 -
2020-05-16
a year crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 34 frames:

Primary Page: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Frame ID: 3637CEDB195D3AACAC8A0B6B894F4DF0
Requests: 154 HTTP requests in this frame

Frame: https://videos.giga.de/embed/176875?autoplay=0
Frame ID: 585E0D1CDCD755C8927756355FB99578
Requests: 19 HTTP requests in this frame

Frame: https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Frame ID: BD9BEDBE04E20A70DAD2AB9C210BC874
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20190924/r20190131/zrt_lookup.html
Frame ID: 83EC64467A9F9E248DDC18FD41DEA05A
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1569721572&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1569721572342&bpp=7&bdt=223&fdt=68&idt=69&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&correlator=2660213026801&frm=20&pv=2&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&ga_fc=0&iag=0&icsg=833240408264&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21064522%2C21064534&oid=3&pvsid=2472101747094926&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=c6RdWPW61R&p=https%3A//www.giga.de&dtd=81
Frame ID: 26FC4679A2DE516B796DF928427463DC
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1569721572&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1569721572349&bpp=4&bdt=230&fdt=108&idt=108&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=2660213026801&frm=20&pv=1&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&ga_fc=0&iag=0&icsg=3332961633064&dssz=60&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21064522%2C21064534&oid=3&pvsid=2472101747094926&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=112
Frame ID: 59DB8598A9160CE623D99C4C10312A9B
Requests: 1 HTTP requests in this frame

Frame: https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Frame ID: C3CCC26767EBC4F0C14EA7C181557A54
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstCIOxnkOt6SpDRQSGtTN8jKb4wZwyGHYW-uYjHhoqPae32EVXVdcdaNDSffBYZGEUvPAvrIcPCx8tAyDA31PR9aYfyDkHVQ3VNJa1-4GHSRsNyMO5b0kgCAepA9sulUzNMvRuRYLV6qWqWRyfz4dbHJlgdeQBn1dzbsucwAZgO4Pf14gTEtTk_ES8sswt_8OnZsSXbmvZr7fAxifwoxNmHtDL56xTMIJCCBtSui0zGQrSrv2JecV6P4bEGjeOq8hJIfZJPVxW_Yz8djK91Cp0RIA&sig=Cg0ArKJSzOyHyMEVOEVbEAE&urlfix=1&adurl=
Frame ID: 0DC89F001FFC6AFADED15528ACF754EC
Requests: 14 HTTP requests in this frame

Frame: https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Frame ID: 41D2F2CCB89B9535DA1EB4EBB0416F69
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvI9FM-Il3AQzw4GUPoVyvMH8UuvDcCv5xsKr0dvFnzj2i4zU5G88uloHEiNbflkSjv7_GJY309PPo7Kx2jG5vE_jI_BGyX7TcDem6J6TYAV1L6sjewBW8CbC3vwii7l2Xmrzbmq1LHWYcP8PpQxdOYH9ViRlXKXYDDHg1ag7jSIjkR-P4Ycye6umCJBgCbi1VNdho8jP-ptYAcEKFwXnMseAnF9kan8SLj6T68TVTvP4O5SkRuG2IOQ2j_cy46iXEX5BuIojWyl0PWWlqtsKWplPx4L7oIgvi6Q_Co&sig=Cg0ArKJSzKahW4RyKFWdEAE&urlfix=1&adurl=
Frame ID: 4DFC9B5E69EB8FC44B531CF477A87168
Requests: 5 HTTP requests in this frame

Frame: https://ad4m.at/frame.html
Frame ID: 997D250B4BE60D51A0D06C78929A2A23
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstBbK0W8zZBEQyHQzp4azhJ128V7sgK2iL7tZX-P0CGuy-o89AEuzGY6K0ZkgUvtL3quNULiZ9o0k-v3Tg5End_Fkkp2wGLvlWUadvcA-hxYeR1WX4VVg8cEeQ27WNEbu-yVFBlSFdY1osei4WU4h4yjw8RPiwipbPRMSG4ho5-ZrzmiGN07kmwrmDbFFtDSAHSddPLtRHLiaZEticlI6oFdake6EwAbEQ4PcvYcPotd5ozAsCjMvkO3RtPNF_lkKMWIspWhXs-a-1X54GJ-DxewWmJVYQyhkrCaDJB&sig=Cg0ArKJSzG6Q-PVgiVfSEAE&urlfix=1&adurl=
Frame ID: 8E2D510D0C24E648A187495D029884E7
Requests: 5 HTTP requests in this frame

Frame: https://ad4mat.net/frame.html
Frame ID: D5682AD2B0A42D1E48727D50D470EDB9
Requests: 1 HTTP requests in this frame

Frame: https://ad4m.at/frame.html
Frame ID: A7D7EAAE93DDDFA1BE740C34247A6FB0
Requests: 1 HTTP requests in this frame

Frame: https://ad4mat.net/frame.html
Frame ID: 9ECE4CF8294FEB4168B15F85C5E9CF93
Requests: 1 HTTP requests in this frame

Frame: https://ad4m.at/ad/rar?a=13521&b=oneid9BRsMfmfYxDFKHesQu7trAQagoneid__asuid0asuid__Stroeer_RON_728x90&f=oneid1jWSbfKfYq8F9H5sBupC2WqcMoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=39a78d667f4dbfdbed691c287ab9686e%2F15862427415644907066&i=20612&j=16&k=0&y=0&z=0
Frame ID: 5580017ACF6F5DE5C6DBF67A3F0E3299
Requests: 1 HTTP requests in this frame

Frame: https://ad4m.at/ad/rar?a=13523&b=oneid8gQhDf8fZ2dagHQs3uxtkMKHEoneid__asuid0asuid__Stroeer_RON_160x600&f=oneidZzQSwfBf86YamHxs5uDCJ4zT2oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=bc4545a990083d694bdb4b78988c6de0%2F15773067486453054862&i=20612&j=16&k=0&y=0&z=0
Frame ID: B6E2DEACF9E1C2B87D96B3F20C84A6B4
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvL7k2OB17_0fpBjssqEPY4_NJlXS5hvxLCRsBiYm4mkDIFbvtapVdmEqovg7PRb-JYHI-d9AScVIF1E6Hv0TsjPzbQEb7vrIrHZnrXtzCpJfeorDFReKYEqHo_I5zARm7UpllwuvSEAKxFTHh6ACS4UIuzzQMnSNy0VA635-hdd1SypnEpousO1Xs9pLa_GQwjE8Sd7lHqts5Y84AcdbxUahCPSq8LLlrAlhbyGx4CzelACfUJwWYQ7G2mnn47tNqidQ6tsuuAUTHpeRWbjw&sig=Cg0ArKJSzDTAOtokFsDtEAE&urlfix=1&adurl=
Frame ID: A6C7E3383586B334E28B25C1B8EB6098
Requests: 11 HTTP requests in this frame

Frame: data://truncated
Frame ID: FB844B23D51F811B1C7E7D6DF2D4B4CC
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Frame ID: 7C48180959C94CF0D8A21F734EB1D314
Requests: 1 HTTP requests in this frame

Frame: https://ih.adscale.de/map?format=display&ssl=1
Frame ID: 9B79F7225B5DBC954607F6F3D699C642
Requests: 1 HTTP requests in this frame

Frame: https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/00bec60ad57540d3be39c1bd6cf0b680/ts/1569721574756/v/2/hid/414/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Frame ID: 2FA07FA58B47A61B9E7D0184A34D9FB7
Requests: 1 HTTP requests in this frame

Frame: https://cmp.teads.mgr.consensu.org/index.html
Frame ID: AF249F0F81F3CC9380CA7840B5684AE0
Requests: 1 HTTP requests in this frame

Frame: https://cmp.teads.mgr.consensu.org/index.html
Frame ID: D63EC155E66EB9484DD9A722195BC5D9
Requests: 1 HTTP requests in this frame

Frame: https://sync.teads.tv/iframe?pid=73584&userId=0bb512f4-2329-45c1-86fc-3d3682ffce36&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1569721575367
Frame ID: 79FA45D846E5408564642F36094BBAF0
Requests: 1 HTTP requests in this frame

Frame: https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=c181106f-0e2a-4145-a396-46e747d96b0a
Frame ID: C88C9836E3C4EB46687054E743686A55
Requests: 11 HTTP requests in this frame

Frame: https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=52864A3A391661297341746682574&cicmp=1657475&cijs=1&dast=V7lNgCFgO1D0dat13hJwS1D0dat13hJwUAAAAGBvQHHDUZzkYLzoKzXMxmi8lyt9lMZovZZrCZbaYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDJgeB-v-nktxz-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VMOOzkP9XyJGVKBaxAgAAACgjd2r4mhSJ1QWVQAABOlWAFcAAAFterJq9Vm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTQhKBT0NiDGWWO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA4GRaTJZDAermcfksUxstoXJMfJNHCOXw7CaeSzbw07pXkLT4DPsGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-BGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhJGVYzGyOFxumW9icYtWk5lbYdlY3KLBcDNzOSe7mWvhFr0-ptNwuZzMdlsUDKjai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8LINJkshoPVzGPyWCY228LkGPkmjpHLYVjNPJZ9ZeVYjCwOl1vmm1jcotVk5lZYNha3aDDczFzOyW7mWrhFr4_pNFwuJ7PdvrGaLXeTxWq32jdWs-VusljtVvsOneG7-pyNyptW4fHppubJWCxzGhQug8X7O1qksVtvZlQpwxaLaloMj45-v9_v9_v9fr_fb9B6DmaDQRFLBKeLdCJ6GU8XsUTytEgnCotxtFgMF4PVajNx7QarkcswM6xWlsXK4RiMJhOxRGm6SCd63cviMBw-f8HDeXiY_aKn4fD5Cx7Ow8PsFvt9Trtb83frXEbT5626m9yav1vsd3lOb6XR8hb7fU67W3D5W8wut8ui_mNDDJZzyWY2V47mksUqAQAAAAAAAAAsYc68CQAAAMBpIIvFYLJYLgCEGOsuwadUyKMT-Ftx48cQc7r8XS7LW_O2uHVOn8PKABI7BQ!&excid=22&tst=1&docw=0
Frame ID: 43CA30459D84E6D89A61A6411F548219
Requests: 1 HTTP requests in this frame

Frame: https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Frame ID: 3FBB8BF5CAB608A58FCA241E661D2060
Requests: 1 HTTP requests in this frame

Frame: https://ads.pubmatic.com/AdServer/js/showad.js
Frame ID: 64716897A1D73D1FFFE046DFAAF4E64D
Requests: 1 HTTP requests in this frame

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: 97D8658FB35760106BD8D6711698CCD1
Requests: 1 HTTP requests in this frame

Frame: https://eus.rubiconproject.com/usync.html
Frame ID: D5EA7838831E8D59C3C2282801256B67
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=432523018&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Frame ID: 8B02BC2725A52D18F5BF228E116FECA5
Requests: 1 HTTP requests in this frame

Frame: https://uss.xplosion.de/usersync?sid=65966&fpid=4205224686072324599
Frame ID: D220A17D8EA45F1A69E45A96E65771B4
Requests: 1 HTTP requests in this frame

Frame: https://adstax-match.adrtx.net/activation?receiverId=adaud
Frame ID: 44FCD6CEBA45F76674D466D237D313D3
Requests: 1 HTTP requests in this frame

Screenshot


Detected technologies

Overall confidence: 100%
Detected patterns
  • headers server /nginx(?:\/([\d.]+))?/i

Overall confidence: 100%
Detected patterns
  • script /googlesyndication\.com\//i

Overall confidence: 100%
Detected patterns
  • script /google-analytics\.com\/(?:ga|urchin|analytics)\.js/i

Overall confidence: 100%
Detected patterns
  • html /<iframe[^>]* (?:id="comscore"|scr=[^>]+comscore)|\.scorecardresearch\.com\/beacon\.js|COMSCORE\.beacon/i
  • script /\.scorecardresearch\.com\/beacon\.js|COMSCORE\.beacon/i

Page Statistics

241
Requests

95 %
HTTPS

20 %
IPv6

63
Domains

103
Subdomains

76
IPs

7
Countries

2578 kB
Transfer

7760 kB
Size

14
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 18
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1 HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 20
  • https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent HTTP 302
  • https://cx.atdmt.com/?c=13118044424176730811&f=AYxLmmDfO-IMlGt5nlbPcxF-RRpSamvltbXwEzK4pHVPmehb4f6gbirKG_DjxZbo5CvtR7rtASWX94kbSVZcMp5H&id=1773162896260346&l=3&v=0
Request Chain 25
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2Fn.a.&cb=001c&i2=001cb759c4a1700495d900ce4&ep=1601208196&vr=415&id=sxnjyl&i3=001cb759c4a1700495d900ce4%3A1599443172227%3A1569721572227%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1569721572227&n1=2&dntt=0&lt=1569721572229&ev=&cs=w4rkgz&mo=0 HTTP 302
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2Fn.a.&cb=001c&i2=001cb759c4a1700495d900ce4&ep=1601208196&vr=415&id=sxnjyl&i3=001cb759c4a1700495d900ce4%3A1599443172227%3A1569721572227%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1569721572227&n1=2&dntt=0&lt=1569721572229&ev=&cs=w4rkgz&mo=0&sr=71 HTTP 302
  • https://de.ioam.de/blank.gif
Request Chain 29
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Request Chain 34
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 84
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox HTTP 302
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Request Chain 112
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssauCih4skiwSFpI4ZsUywJamwKtedB1IHdGqYfsiknYq0Gy4O0CojWqjsbuAMMR4uA6o44z6EDtJcSCCYiKvCF5MJlyQUVEVmei9DkvI07HnjHqfT11Me-Wna2jsDs5JSeHGKWspqqybuh2JsQrWyxaFOLwp4HScu6D9uf2EzPRTnss_2GP72gNxHqALGeh7oXT-N6wByJYXklycuNEcmR1moXtB9gkcg4wn7MjDtoz1_bc52x_RRC1xA3CH1RAld8NMcBrBOYKMAeJTGYGQ&sig=Cg0ArKJSzLTLQVlnWfCoEAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 133
  • https://ad4m.at/rs?a=&b=40&c=680&d=&e=728&f=90&g=0&h=Stroeer_RON_728x90&i=&j=1065&k=1&l=&m=&n= HTTP 307
  • https://ad4m.at/ad/rar?a=13521&b=oneid9BRsMfmfYxDFKHesQu7trAQagoneid__asuid0asuid__Stroeer_RON_728x90&f=oneid1jWSbfKfYq8F9H5sBupC2WqcMoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=39a78d667f4dbfdbed691c287ab9686e%2F15862427415644907066&i=20612&j=16&k=0&y=0&z=0
Request Chain 134
  • https://ad4m.at/rs?a=&b=38&c=680&d=&e=160&f=600&g=0&h=Stroeer_RON_160x600&i=&j=1065&k=1&l=&m=&n= HTTP 307
  • https://ad4m.at/ad/rar?a=13523&b=oneid8gQhDf8fZ2dagHQs3uxtkMKHEoneid__asuid0asuid__Stroeer_RON_160x600&f=oneidZzQSwfBf86YamHxs5uDCJ4zT2oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=bc4545a990083d694bdb4b78988c6de0%2F15773067486453054862&i=20612&j=16&k=0&y=0&z=0
Request Chain 167
  • https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=http%3A%2F%2Fwww.giga.de&nuggl=https%3A%2F%2Fih.adscale.de%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYmJiY2Mw%2Fuu%2F00bec60ad57540d3be39c1bd6cf0b680%2Fts%2F1569721574756%2Fv%2F2%2Fhid%2F414%2Fssl%2F1%2Fws%2Fhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%2Fnvars%2FNUGGVARS HTTP 302
  • https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/00bec60ad57540d3be39c1bd6cf0b680/ts/1569721574756/v/2/hid/414/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Request Chain 173
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575247&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=53268553&cs_ucfr=1 HTTP 302
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575247&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=53268553&cs_ucfr=1
Request Chain 176
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575262&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=94179775&cs_ucfr=1 HTTP 302
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575262&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=94179775&cs_ucfr=1
Request Chain 193
  • https://rtb.mfadsrvr.com/sync?ssp=taboola HTTP 302
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola HTTP 302
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=c181106f-0e2a-4145-a396-46e747d96b0a
Request Chain 195
  • https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D HTTP 302
  • https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=qs5k3k5hJ47461dvhd8MJwuwq27QwwkRG7k7efSWgrY%3D
Request Chain 197
  • https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc HTTP 302
  • https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEGa30KhSh3IZPEvVJGGA3Rk&google_cver=1 HTTP 302
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEGa30KhSh3IZPEvVJGGA3Rk&tbid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267&query=taboola_hm%3DCAESEGa30KhSh3IZPEvVJGGA3Rk%26google_cver%3D1
Request Chain 199
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=9595bd3e-8200-4b09-a0ba-5f60fff6555a HTTP 302
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=9595bd3e-8200-4b09-a0ba-5f60fff6555a&tbid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267&query=taboola_hm%3D9595bd3e-8200-4b09-a0ba-5f60fff6555a
Request Chain 200
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267 HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=8f96a48f-cb16-40f2-971b-a207c767ea2f HTTP 302
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=8f96a48f-cb16-40f2-971b-a207c767ea2f&tbid=fb2510d7-067a-47ea-a7d1-1d442a203fa1-tuct4899269&query=taboola_hm%3D8f96a48f-cb16-40f2-971b-a207c767ea2f
Request Chain 203
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://u.ipw.metadsp.co.uk/sync?ssp=bidswitch&bidswitch_ssp_id=taboola&bsw_user_id=e7a3b43e-fcad-4b52-8744-f064ce91becf&bsw_param=e7a3b43e-fcad-4b52-8744-f064ce91becf HTTP 302
  • https://u.ipw.metadsp.co.uk/ul_cb/sync?ssp=bidswitch&bidswitch_ssp_id=taboola&bsw_user_id=e7a3b43e-fcad-4b52-8744-f064ce91becf&bsw_param=e7a3b43e-fcad-4b52-8744-f064ce91becf HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=339&expires=14&user_group=1&user_id=414e86be-62e2-41c8-ac6c-0baa474a8f97&ssp=taboola&bsw_param=e7a3b43e-fcad-4b52-8744-f064ce91becf HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?dsp_id=339&expires=14&user_group=1&user_id=414e86be-62e2-41c8-ac6c-0baa474a8f97&ssp=taboola&bsw_param=e7a3b43e-fcad-4b52-8744-f064ce91becf HTTP 302
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=77929f75-6d0f-440b-acfa-db0821abaa5e HTTP 302
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=77929f75-6d0f-440b-acfa-db0821abaa5e&tbid=fb2510d7-067a-47ea-a7d1-1d442a203fa1-tuct4899269&query=taboola_hm%3D77929f75-6d0f-440b-acfa-db0821abaa5e
Request Chain 218
  • https://cdn.m6r.eu/sync/api HTTP 302
  • https://tracking.m6r.eu/sync/api?checkcookies=true
Request Chain 221
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=fe38a3918cedb0bb2d0c36baef772894&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Dfe38a3918cedb0bb2d0c36baef772894%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=fe38a3918cedb0bb2d0c36baef772894&userId=adscale-user:a1806aa1487f4dc18892c53b78372265
Request Chain 222
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=fe38a3918cedb0bb2d0c36baef772894
Request Chain 223
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=_jijkYztsLstDDa673colA HTTP 302
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=_jijkYztsLstDDa673colA&google_tc= HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 224
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=fe38a3918cedb0bb2d0c36baef772894
Request Chain 240
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCESRkBSa3BDfkBDUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 307
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4205224686072324599

241 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
141 KB
52 KB
Document
General
Full URL
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
eb37ebd04d1be5ff16adcf9c5df0277fd7238655eeeedfdf7f265b98697e36b2

Request headers

:method
GET
:authority
www.giga.de
:scheme
https
:path
/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
navigate
sec-fetch-user
?1
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
none
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
navigate
Sec-Fetch-User
?1

Response headers

status
200
server
nginx
content-type
text/html; charset=UTF-8
vary
Accept-Encoding
date
Sun, 29 Sep 2019 01:46:12 GMT
x-page-speed
1.13.35.2-0
cache-control
max-age=0, no-cache
content-encoding
gzip
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
15 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
last-modified
Fri, 27 Sep 2019 11:52:29 GMT
server
nginx
accept-language
bytes
etag
"5d8df7fd-3c78"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15480
expires
Mon, 28 Sep 2020 01:46:12 GMT
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
last-modified
Fri, 27 Sep 2019 11:52:29 GMT
server
nginx
accept-language
bytes
etag
"5d8df7fd-3da8"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15784
expires
Mon, 28 Sep 2020 01:46:12 GMT
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
16 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
last-modified
Fri, 27 Sep 2019 11:52:29 GMT
server
nginx
accept-language
bytes
etag
"5d8df7fd-3e24"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15908
expires
Mon, 28 Sep 2020 01:46:12 GMT
lux.js
cdn.speedcurve.com/js/
19 KB
7 KB
Script
General
Full URL
https://cdn.speedcurve.com/js/lux.js?id=131387135
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.217 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
Apache /
Resource Hash
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

strict-transport-security
max-age=15768000
content-encoding
gzip
age
83439
x-cache
HIT
status
200
content-length
6462
x-served-by
cache-fra19138-FRA
access-control-allow-origin
*
last-modified
Sat, 28 Sep 2019 02:35:33 GMT
server
Apache
x-timer
S1569721572.211528,VS0,VE0
date
Sun, 29 Sep 2019 01:46:12 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
expires
Sun, 29 Sep 2019 02:35:33 GMT
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
x-cache-hits
8860
pre-4e25f0b3c7.js
www.giga.de/static-local/dist/assets/js/
59 KB
19 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
6c30c8bf65ef340337fa091233d65a79fb7a1021663ac0b2793789064425c4ad

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 27 Sep 2019 11:53:46 GMT
content-encoding
gzip
x-original-content-length
60608
server
nginx
status
200
etag
W/"5d8df7ff-ecc0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
19334
expires
Sat, 26 Sep 2020 11:53:46 GMT
main-desktop-6c1403c088.css
www.giga.de/static-local/dist/assets/css/
356 KB
49 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-6c1403c088.css
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
b8aac981ff52fa651bcd9fb2d2375a4d4c7cb6b647ed263b4afdfb93a158e4e6

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 12:44:56 GMT
content-encoding
gzip
x-original-content-length
364890
server
nginx
status
200
etag
W/"5d8a0f77-5915a"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
50174
expires
Wed, 23 Sep 2020 12:44:56 GMT
iam.js
script.ioam.de/
34 KB
11 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 001c
Resource Hash
fc093a072783c7d78fae4f82fb188d11c19f3366ce94803a02e7de6b9f421451

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:12 GMT
Content-Encoding
gzip
Last-Modified
Sun, 29 Sep 2019 01:46:12 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 001c
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Sun, 29 Sep 2019 03:46:12 GMT
metaTag.min.61d318c9032cb42523b17c86635454bd.js
js.stroeermediabrands.de/
248 KB
60 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.61d318c9032cb42523b17c86635454bd.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
46.253.113.178 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
2e612006c729145084864324fe4b4e7b77aeab15de9c6629feeaa8670c77fb6e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
last-modified
Fri, 27 Sep 2019 13:04:02 GMT
server
nginx/1.14.1
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=31536000, public immutable max-age=31536000
expires
Mon, 28 Sep 2020 01:46:12 GMT
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
796 B
1 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/05/2501-rcm40x40.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 19 Sep 2019 14:38:47 GMT
x-content-type-options
nosniff
age
817644
filer-source
ca7b44b53d5a66e850355c11821198c504e518f8f12b295bd9c54d22bb538e08
x-cache
HIT
status
200
accept-language
bytes
content-length
796
x-xss-protection
1; mode=block
last-modified
Thu, 19 Sep 2019 14:38:47 GMT
server
nginx/1.10.3
filer-attr
W1s0MCw0MF0sInNodXR0bGUtdjEiLFsiRlJBLTEiXSxbIkZSQi0xIl1d
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sat, 19 Oct 2019 14:38:47 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
101 KB
36 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
59345f09f23610da29c99d8fcd956666db82be2baf53965023add35dfabd975b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
36220
x-xss-protection
0
server
cafe
etag
1056613545002361170
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Sun, 29 Sep 2019 01:46:12 GMT
paypal-login-deutsch-rcm960x0.jpg
static.giga.de/wp-content/uploads/2015/07/
18 KB
19 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/07/paypal-login-deutsch-rcm960x0.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 28 Sep 2019 07:44:31 GMT
x-content-type-options
nosniff
age
64901
filer-source
3dc62a8e18f9b6ceb94ecf895297d72ce0545c5156c00f0fa8e434dc55d3102e
x-cache
HIT
status
200
accept-language
bytes
content-length
18921
x-xss-protection
1; mode=block
last-modified
Sat, 07 Sep 2019 12:36:06 GMT
server
nginx/1.10.3
filer-attr
W1s4OTAsNDg1XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 07 Oct 2019 12:36:06 GMT
2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.jpg
crops.giga.de/0a/ad/ab/
16 KB
17 KB
Image
General
Full URL
https://crops.giga.de/0a/ad/ab/2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
a0611e486e87faf678d732cede5f2b94c26550f87a9e8baf6393ac3e8f96268b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 25 Sep 2019 05:48:36 GMT
x-content-type-options
nosniff
age
331056
filer-source
833cb36a650161e736193aec5c3891398d2fa56a03e872ecb4014e0c343af106
x-cache
HIT
status
200
accept-language
bytes
content-length
16480
x-xss-protection
1; mode=block
last-modified
Wed, 25 Sep 2019 05:48:36 GMT
server
nginx/1.10.3
filer-attr
W1s2MjUsMjEwXSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Fri, 25 Oct 2019 05:48:36 GMT
PayPal-Login-Page-rcm464x0.jpg
static.giga.de/wp-content/uploads/2015/07/
21 KB
21 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/07/PayPal-Login-Page-rcm464x0.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 09 Sep 2019 04:05:34 GMT
x-content-type-options
nosniff
age
1719637
filer-source
7154c03f1279d42875baf477c69c8abd717043148b5dba0c147151812277507b
x-cache
HIT
status
200
accept-language
bytes
content-length
21316
x-xss-protection
1; mode=block
last-modified
Mon, 09 Sep 2019 04:05:34 GMT
server
nginx/1.10.3
filer-attr
W1s0MTUsNTczXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Wed, 09 Oct 2019 04:05:34 GMT
commander4j-rcm200x113.jpg
static.giga.de/wp-content/uploads/2019/05/
8 KB
8 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/05/commander4j-rcm200x113.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
5d62a434970b61305d78c48011b07ec536712100117e9b36b7c32c2be9888bf6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 23 Sep 2019 02:20:16 GMT
x-content-type-options
nosniff
age
516356
filer-source
f2d6da04711ce2bae19e96e0da336b08754b40cf31dde89afabb20ee8c2f2fc3
x-cache
HIT
status
200
accept-language
bytes
content-length
7931
x-xss-protection
1; mode=block
last-modified
Mon, 02 Sep 2019 10:14:13 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Wed, 02 Oct 2019 10:14:13 GMT
ios-13-screens-apple-rcm200x113.jpg
static.giga.de/wp-content/uploads/2019/01/
8 KB
9 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/01/ios-13-screens-apple-rcm200x113.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
f2cb1fffde0db39f5891b0526ef7d06559baab2b122ee451627d1c8c1c9d6ace
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 21 Sep 2019 12:01:13 GMT
x-content-type-options
nosniff
age
654298
filer-source
a388b0e1be1b1567b89f5b5d1445a799ab55b6c2119fae9005502aab21bf1b92
x-cache
HIT
status
200
accept-language
bytes
content-length
8385
x-xss-protection
1; mode=block
last-modified
Wed, 04 Sep 2019 17:09:08 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Fri, 04 Oct 2019 17:09:08 GMT
Driver-Booster-1-rcm200x113.jpg
static.giga.de/wp-content/uploads/2017/07/
5 KB
5 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2017/07/Driver-Booster-1-rcm200x113.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
93f4275ac47482a7af300336dc775f356eb0b2b45f751dd5403bba137bad61bf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 20 Sep 2019 08:04:52 GMT
x-content-type-options
nosniff
age
754879
filer-source
706d6b6fc565d7c89b79230c350760afb5c2c2fff825acba32bd2f159436b850
x-cache
HIT
status
200
accept-language
bytes
content-length
4863
x-xss-protection
1; mode=block
last-modified
Mon, 09 Sep 2019 10:09:29 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Wed, 09 Oct 2019 10:09:29 GMT
Siri-Geld-verschicken-PayPal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2016/11/
6 KB
6 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2016/11/Siri-Geld-verschicken-PayPal-rcm235x129.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 09 Sep 2019 04:05:35 GMT
x-content-type-options
nosniff
age
1719637
filer-source
8fa6d82067b578ca8e6bb273bed34f9d123e3ee778a1db1a4f9ea350b5447154
x-cache
HIT
status
200
accept-language
bytes
content-length
5657
x-xss-protection
1; mode=block
last-modified
Mon, 09 Sep 2019 04:05:35 GMT
server
nginx/1.10.3
filer-attr
W1syMzUsMTI5XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Wed, 09 Oct 2019 04:05:35 GMT
trackcp.js
gocp.stroeermediabrands.de/
27 KB
10 KB
Script
General
Full URL
https://gocp.stroeermediabrands.de/trackcp.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.16.106 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.106.16.40.188.clients.your-server.de
Software
/
Resource Hash
85838fca0e7ee704142710df49c3ce62ed2d4dc4b52c3b644ca816608ea08099

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:12 GMT
Content-Encoding
gzip
Last-Modified
Thu, 19 Sep 2019 14:14:26 GMT
ETag
"5d838d42-6df1"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Expires
Mon, 30 Sep 2019 01:46:12 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
  • https://ssl-econa.met.vgwort.de/blank.gif
43 B
310 B
Image
General
Full URL
https://ssl-econa.met.vgwort.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
161.156.66.178 , United States, ASN36351 (SOFTLAYER - SoftLayer Technologies Inc., US),
Reverse DNS
b2.42.9ca1.ip4.static.sl-reverse.com
Software
s2.50.19 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Sun, 29 Sep 2019 01:46:12 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.50.19
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Sun, 29 Sep 2019 01:46:12 GMT
Last-Modified
Sun, 29 Sep 2019 01:46:12 GMT
Server
s2.50.19
Access-Control-Allow-Origin
*
Transfer-Encoding
chunked
Content-Type
text/html
Location
/blank.gif
Cache-Control
max-age=0, no-cache, must-revalidate, proxy-revalidate
Connection
keep-alive
Expires
Tue, 22 Aug 2000 15:05:01 GMT
tr
www.facebook.com/
44 B
247 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=PageView&noscript=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f12d:83:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
content-length
44
expires
Sun, 29 Sep 2019 01:46:12 GMT
/
cx.atdmt.com/
Redirect Chain
  • https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
  • https://cx.atdmt.com/?c=13118044424176730811&f=AYxLmmDfO-IMlGt5nlbPcxF-RRpSamvltbXwEzK4pHVPmehb4f6gbirKG_DjxZbo5CvtR7rtASWX94kbSVZcMp5H&id=1773162896260346&l=3&v=0
42 B
408 B
Image
General
Full URL
https://cx.atdmt.com/?c=13118044424176730811&f=AYxLmmDfO-IMlGt5nlbPcxF-RRpSamvltbXwEzK4pHVPmehb4f6gbirKG_DjxZbo5CvtR7rtASWX94kbSVZcMp5H&id=1773162896260346&l=3&v=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f02d:5:face:b00c:0:8c , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
/
Resource Hash
6d8ba81d1b60a18707722a1f2b62dad48a6acced95a1933f49a68b5016620b93

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Sun, 29 Sep 2019 01:46:12 GMT
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR CUR ADM DEV TAIo PSAo PSDo OUR BUS UNI PUR COM NAV INT DEM STA PRE OTC"

Redirect headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:12 GMT
server
proxygen-bolt
status
302
content-type
text/plain
location
https://cx.atdmt.com/?c=13118044424176730811&f=AYxLmmDfO-IMlGt5nlbPcxF-RRpSamvltbXwEzK4pHVPmehb4f6gbirKG_DjxZbo5CvtR7rtASWX94kbSVZcMp5H&id=1773162896260346&l=3&v=0
cache-control
no-cache, no-store, must-revalidate
content-length
0
expires
0
analytics.js
www.google-analytics.com/
43 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 19 Aug 2019 17:22:41 GMT
server
Golfe2
age
3759
date
Sun, 29 Sep 2019 00:43:33 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Sun, 29 Sep 2019 02:43:33 GMT
apstag.js
c.amazon-adsystem.com/aax2/
75 KB
22 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.151.91 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-151-91.fra53.r.cloudfront.net
Software
Server /
Resource Hash
db1b7df84644392f2ec2e4d7499c2ca1d7f4cde9f6fba0c7a778a97e18b3e805

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 28 Sep 2019 23:00:09 GMT
content-encoding
gzip
server
Server
age
9963
etag
3e04be28b928c5e15e522942645dd5ad
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA53
accept-ranges
bytes
x-amz-cf-id
RnBskg1p86XWO54TPeJrx0CZH2cseCeXIaQ3iY3x6Hv_ipDgikMCHg==
via
1.1 59c171b9abb6b3c58e72495c539dfa68.cloudfront.net (CloudFront)
init
d.nativendo.de/cds/delivery/
991 B
917 B
Script
General
Full URL
https://d.nativendo.de/cds/delivery/init
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
4330193cc2f6442925c50f1f9c9bf19ed4fe8a23012bbbdfe0e5626453809eeb

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
last-modified
Sun, 29 Sep 2019 01:46:12 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
516
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
identitystatus
irqs.ioam.de/
25 B
203 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.40043983113383486
Requested by
Host: script.ioam.de
URL: https://script.ioam.de/iam.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
193.46.63.75 Alfter, Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
irqs.ioam.de
Software
nginx /
Resource Hash
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
blank.gif
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2Fn.a.&cb=001c&i2=001cb759c4a1700495d900ce4&ep=1601208196&vr=415&i...
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2Fn.a.&cb=001c&i2=001cb759c4a1700495d900ce4&ep=1601208196&vr=415&i...
  • https://de.ioam.de/blank.gif
43 B
651 B
Image
General
Full URL
https://de.ioam.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:13 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Cache-Control
max-age=86400
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Content-Length
43
Expires
Mon, 30 Sep 2019 01:46:13 GMT

Redirect headers

Date
Sun, 29 Sep 2019 01:46:13 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 002e
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Sun, 29 Sep 2019 01:46:13 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/blank.gif
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Sat, 29 Sep 2018 01:46:13 GMT
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
9 KB
10 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?62585758
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
1b35bd23206a199b500fdb41aa9dd3ddedb9cbfdd2f1b1da79c5a3f916e737e5

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-6c1403c088.css
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
last-modified
Fri, 27 Sep 2019 11:52:29 GMT
server
nginx
accept-language
bytes
etag
"5d8df7fd-25d8"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
9688
expires
Mon, 28 Sep 2020 01:46:12 GMT
176875
videos.giga.de/embed/ Frame 585E
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/176875?autoplay=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
d83403588cc6bf8c728659869f5c037d9fd3f51f5db5c7b44adbe2c818e15a55

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/176875?autoplay=0
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
same-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
pc=1; ioam2018=001cb759c4a1700495d900ce4:1599443172227:1569721572227:.giga.de:2:giga:software_content:noevent:1569721572227:3kmu94
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.14.1
date
Sun, 29 Sep 2019 01:46:12 GMT
content-type
text/html;charset=UTF-8
link
<https://videos.giga.de/embed/176875>; rel="canonical"
content-encoding
gzip
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.25073417822716015
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
b3b9136f33841bffb0363cd09f4e2b4527da358f771d359d066db6860ae7f727
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:12 GMT
X-Content-Type-Options
nosniff
Last-Modified
Sun, 29 Sep 2019 01:46:12 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Mon, 30 Sep 2019 01:46:08 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame BD9B
Redirect Chain
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
0
0
Document
General
Full URL
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash

Request headers

Host
tracking.m6r.eu
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
test=true
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx
Content-Type
text/html; charset=utf-8
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Content-Encoding
gzip
Date
Sun, 29 Sep 2019 01:46:12 GMT
Content-Length
1533
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=e6070c614041717261f52ff39904d2c9; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Sat, 28 Dec 2019 01:46:12 GMT

Redirect headers

Server
nginx
Content-Type
text/html; charset=utf-8
Content-Length
302
Location
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Date
Sun, 29 Sep 2019 01:46:12 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Sun, 29 Sep 2019 02:46:12 GMT
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
647 B
865 B
Image
General
Full URL
https://www.giga.de/wp-content/themes/project/assets/img/teaser/bg-teaser.png
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.61d318c9032cb42523b17c86635454bd.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-6c1403c088.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 27 Mar 2019 23:22:31 GMT
server
nginx
accept-language
bytes
etag
"5c9a42da-287"
status
200
access-control-allow-methods
GET
content-type
image/png
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
647
expires
Thu, 26 Mar 2020 23:22:31 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
44 KB
14 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.61d318c9032cb42523b17c86635454bd.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
sffe /
Resource Hash
37d39806e6c97d65ef8faf4fc91d08cff2bc5009bf45f73f6040df50f25e48cf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"293 / 799 of 1000 / last-modified: 1569601082"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14245
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:12 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
287 KB
89 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.61d318c9032cb42523b17c86635454bd.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.51 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-51.fra53.r.cloudfront.net
Software
/ Express
Resource Hash
ebfe038cec11237af72424d60db98deef4aae52fb9e8584ac985d52d84a133f7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-amz-cf-pop
FRA53-C1
status
200
x-powered-by
Express
vary
Accept-Encoding
x-cache
Miss from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=10800
x-amz-cf-id
3CDRd2-2bWo2VVSiKhms8hmT9Yorz726eWpfObpgi7DvgzHeFnTycg==
via
1.1 7549433a09d06354ea864d169b689e51.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
124 KB
48 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.61d318c9032cb42523b17c86635454bd.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:19 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=7200
Connection
keep-alive
Content-Type
text/javascript
Content-Length
49094
Expires
Sun, 29 Sep 2019 03:46:19 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
599 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
504669a45bd5068ea7b4a1137b22cdacff6dd20ad5da8e571206e9ea961ed9ed

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:12 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
108

Redirect headers

Date
Sun, 29 Sep 2019 01:46:12 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.giga.de
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72
rc
si.nuggad.net/
2 KB
1 KB
Script
General
Full URL
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.61d318c9032cb42523b17c86635454bd.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_CBC
Server
80.82.201.88 Berlin, Germany, ASN48173 (UNBELIEVABLE-AS, DE),
Reverse DNS
pbtgx-nuggad.unbelievable-machine.net
Software
Apache /
Resource Hash
bf62973c91c17fa21fb5281e96d9f7bbccd8c3133bf493b6a27e231044b385b3

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:19 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Status
200 OK
Cache-Control
no-store,no-cache
Transfer-Encoding
chunked
Connection
close
Content-Type
text/javascript
Keep-Alive
timeout=3, max=500
Expires
Wed, 18 Feb 2009 11:53:30 GMT
ad-loading.gif
www.dunkirkinception.com/detect/
125 B
436 B
Image
General
Full URL
https://www.dunkirkinception.com/detect/ad-loading.gif?p=imagez/
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.29.62 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-29-62.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
a076460215972ba3aff72729a43dc7989ef8a85dba721e287bc9ccefeae3aa0f

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:12 GMT
X-Powered-By
TSAdServer
ETag
W/"7d-dyD3qVGWnWMxHmLFkRxdDzZ9PJk"
Content-Type
image/png
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
X-Robots-Tag
noindex, nofollow
Content-Length
125
tag.js
js.agkn.com/prod/v0/
3 KB
3 KB
Script
General
Full URL
https://js.agkn.com/prod/v0/tag.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.61d318c9032cb42523b17c86635454bd.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:214f:d800:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 28 Sep 2019 15:50:02 GMT
via
1.1 7d89b6cf83f15400102bd86c47585040.cloudfront.net (CloudFront)
last-modified
Thu, 11 Jul 2019 15:46:11 GMT
server
AmazonS3
age
35838
etag
"a5442c681a576408c25edbf365995343"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
content-length
3167
x-amz-cf-id
yp6bNOkCP8jFKuR3GvCyiMuwv5v5VpKRLsHxSPeMORWyYm3PlZSuOw==
post-a50fd9706a.js
www.giga.de/static-local/dist/assets/js/bundle/
7 KB
3 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/post-a50fd9706a.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
68054f40ce80021898dbb852bef549b5e4a8bd833ea36186a569d529e9bb4de3

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 27 Sep 2019 11:53:47 GMT
content-encoding
gzip
x-original-content-length
7092
server
nginx
status
200
etag
W/"5d8df7fe-1bb4"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2702
expires
Sat, 26 Sep 2020 11:53:47 GMT
giga-6b59f15322.js
www.giga.de/static-local/dist/assets/js/bundle/
31 KB
12 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/giga-6b59f15322.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
f6c88d72ddbc86769c79cd60c2fbffac3679934dca3c2173dc8f919bcbbbfd64

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 09 Jul 2019 13:23:44 GMT
content-encoding
gzip
x-original-content-length
31346
server
nginx
status
200
etag
W/"5d2494e5-7a72"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
11745
expires
Wed, 08 Jul 2020 13:23:44 GMT
smb-phone-plan-ef34ebe4f8.js
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
53 KB
18 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/smb-phone-plan-ef34ebe4f8.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 11 Sep 2019 09:34:34 GMT
content-encoding
gzip
x-original-content-length
54000
server
nginx
status
200
etag
W/"5d78bf3c-d2f0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
18237
expires
Thu, 10 Sep 2020 09:34:34 GMT
article-rating-7143c629e5.js
www.giga.de/static-local/dist/assets/js/components/
306 B
534 B
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/article-rating-7143c629e5.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 27 Mar 2019 23:22:29 GMT
content-encoding
gzip
x-original-content-length
306
server
nginx
accept-language
bytes
status
200
etag
"5c9a4313-132"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
234
expires
Thu, 26 Mar 2020 23:22:28 GMT
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/
227 KB
84 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
d7625641666eb0d30c70ca6fa1cac3b0705486578733a364c9eff073045ae084
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
85560
x-xss-protection
0
server
cafe
etag
13535242702471442266
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sun, 29 Sep 2019 01:46:12 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190924/r20190131/ Frame 83EC
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20190924/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20190924/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
vary
Accept-Encoding
date
Tue, 24 Sep 2019 14:02:07 GMT
expires
Tue, 08 Oct 2019 14:02:07 GMT
content-type
text/html; charset=UTF-8
etag
2890223722171781336
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7315
x-xss-protection
0
cache-control
public, max-age=1209600
age
387845
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
js
www.google-analytics.com/gtm/
72 KB
25 KB
Script
General
Full URL
https://www.google-analytics.com/gtm/js?id=GTM-KRW4T6J&t=gt1&cid=409114290.1569721572&aip=true
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
83a20b049ccd6bf59807f68f989a45ea911697172a546839b7d5a0b5c2320206
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
br
server
Google Tag Manager
access-control-allow-headers
Cache-Control
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
http://www.googletagmanager.com
cache-control
private, max-age=900
access-control-allow-credentials
true
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24966
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:12 GMT
dkuim.js
dkuim.de/api/js/2/
465 KB
151 KB
Script
General
Full URL
https://dkuim.de/api/js/2/dkuim.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.65.130 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:12 GMT
Content-Encoding
gzip
Last-Modified
Tue, 11 Dec 2018 15:40:09 GMT
Server
nginx
ETag
W/"5c0fda59-74548"
Transfer-Encoding
chunked
Content-Type
application/javascript
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__ir=&__is=1600_1200_24&__iu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&__id=1569721572384&__it=-120&__ic=727391&__iq=96e9a9f8958d4a7cb97aa9929666d762&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:12 GMT
Last-Modified
Mon, 21 Sep 2009 01:44:32 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Sun, 23 Sep 2012 01:44:32 GMT
bid
c.amazon-adsystem.com/e/dtb/
122 B
502 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=2006457546861569721572389&cb=6788765642761569721572390&ws=1600x1200&v=7.36.03&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%22sky-2%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%22rectangle-4%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.151.91 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-151-91.fra53.r.cloudfront.net
Software
Server /
Resource Hash
0c28220b73b11e2033c33c9d1191f6052642f80407aa364a01e378b8c5821cb6

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA53
status
200
vary
Accept-Encoding,User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
131
via
1.1 59c171b9abb6b3c58e72495c539dfa68.cloudfront.net (CloudFront)
x-amz-cf-id
NOaRfbQ6PORD1s_oT1vY0yL5xa6XiuvHeNi_HSK8YffvdAMl2rOk6Q==
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.151.91 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-151-91.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 28 Sep 2019 02:33:01 GMT
content-encoding
gzip
vary
Accept-Encoding,Origin
age
83834
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Fri, 24 Aug 2018 07:13:51 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 300b920cc4a53d2daec2ba8180596d82.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA53
x-amz-cf-id
L7vfAHz6AL0wFyvW2C74qigJH10lxjbhioNDx9T1j8cE4G6NcC4LIg==
platform.js
apis.google.com/js/
43 KB
17 KB
Script
General
Full URL
https://apis.google.com/js/platform.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
ESF /
Resource Hash
1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-security-policy-report-only
script-src 'report-sample' 'nonce-2WlMn2yf9zKqWe3fNpfEeA' 'unsafe-inline' 'strict-dynamic' https: http: 'unsafe-eval';object-src 'none';base-uri 'self';report-uri /_/cspreport
p3p
CP="This is not a P3P policy! See g.co/p3phelp for more info."
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
x-xss-protection
0
x-ua-compatible
IE=edge, chrome=1
server
ESF
x-frame-options
SAMEORIGIN
etag
"ce8f41226b511978bd0b369f1ffcc6fc"
strict-transport-security
max-age=31536000
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
private, max-age=1800, stale-while-revalidate=1800
timing-allow-origin
*
expires
Sun, 29 Sep 2019 01:46:12 GMT
loader.js
cdn.taboola.com/libtrc/stroeer-smb-giga/
113 KB
22 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/bundle/post-a50fd9706a.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
22ce005a22e7722f09a4306b188728d7997a14d4c3e07b67d55c993c41e7a961

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
7ebyPGYcGVB.9WrMOwMkZGCdUHkImuLn
content-encoding
gzip
etag
"0e6d43793cddaa90ff31e322abd063d8"
age
116
x-cache
HIT
status
200
content-length
22070
x-amz-id-2
VX1FiLIUqSBtZgVXsL1kBMfv+gsKYq/tHZRMQ2WsN2IuDVLqeX6qh0e7DW8NmtUnBvep/ldecRs=
x-served-by
cache-hhn4075-HHN
last-modified
Thu, 26 Sep 2019 07:45:55 GMT
server
AmazonS3
x-timer
S1569721576.781819,VS0,VE0
date
Sun, 29 Sep 2019 01:46:15 GMT
vary
Accept-Encoding
x-amz-request-id
2BA4790CFF811926
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
99
x-cache-hits
1
videojs-02e1d46d.min.js
videos.giga.de/dist/js/embed/bundle/ Frame 585E
618 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
5aeb54f6727af87431148b611f64c2d9608b22f49b71cd313f5e023b0f6ee642

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
last-modified
Tue, 17 Sep 2019 08:48:02 GMT
server
nginx/1.14.1
etag
W/"5d809dc2-9a957"
content-type
application/javascript
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/ Frame 585E
263 KB
90 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
99ddca22fc298fbc23f9048c7b3b8d87edd49aaa20e3b32ab169f2e859838e5a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
91447
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:12 GMT
smb-article-rating-f9506c2d61.min.js
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
18 KB
6 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/smb-article-rating-f9506c2d61.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 20 May 2019 10:19:09 GMT
content-encoding
gzip
x-original-content-length
17937
server
nginx
status
200
etag
W/"5ce27eb5-4611"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
6108
expires
Tue, 19 May 2020 10:19:09 GMT
jquery.min.js
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
85 KB
30 KB
Script
General
Full URL
https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 26 Aug 2019 08:21:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
2913887
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
30306
x-xss-protection
0
last-modified
Fri, 24 Mar 2017 20:55:54 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Tue, 25 Aug 2020 08:21:25 GMT
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame 585E
53 KB
15 KB
Stylesheet
General
Full URL
https://videos.giga.de/dist/css/videojs-f50f7a8d.css
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
last-modified
Tue, 17 Sep 2019 08:48:02 GMT
server
nginx/1.14.1
etag
W/"5d809dc2-d280"
content-type
text/css
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
play_button.svg
videos.giga.de/image/ Frame 585E
1015 B
1 KB
Image
General
Full URL
https://videos.giga.de/image/play_button.svg
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
"5d1db79a-3f7"
content-type
image/svg+xml
status
200
cache-control
max-age=7776000
accept-ranges
bytes
content-length
1015
expires
Sat, 28 Dec 2019 01:46:12 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 26FC
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1569721572&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1569721572342&bpp=7&bdt=223&fdt=68&idt=69&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&correlator=2660213026801&frm=20&pv=2&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&ga_fc=0&iag=0&icsg=833240408264&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21064522%2C21064534&oid=3&pvsid=2472101747094926&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=c6RdWPW61R&p=https%3A//www.giga.de&dtd=81
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1569721572&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1569721572342&bpp=7&bdt=223&fdt=68&idt=69&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&correlator=2660213026801&frm=20&pv=2&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&ga_fc=0&iag=0&icsg=833240408264&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21064522%2C21064534&oid=3&pvsid=2472101747094926&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=c6RdWPW61R&p=https%3A//www.giga.de&dtd=81
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Sun, 29 Sep 2019 01:46:12 GMT
server
cafe
content-length
25579
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Sun, 29-Sep-2019 02:01:12 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Sun, 29 Sep 2019 01:46:12 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
d23b76d0502f01f486b0025cdb942713385d66f4775fc86af7166da3c26313c1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569582964828766"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29086
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:12 GMT
pubads_impl_2019091901.js
securepubads.g.doubleclick.net/gpt/
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
sffe /
Resource Hash
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58568
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:12 GMT
collect
www.google-analytics.com/r/
35 B
101 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=385468335&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=196426461&gjid=526631986&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&z=2137901474
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:12 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
99 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd21=auto&cm17=1&cd18=4282584&z=1767598628
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167015
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=177572824
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167015
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=2105804042
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167015
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm75=1&z=1173292798
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167015
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=1406895455
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167015
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=301080826
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167015
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=559808645
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167015
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=1197732866
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167015
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=77102004
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167015
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 59DB
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1569721572&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1569721572349&bpp=4&bdt=230&fdt=108&idt=108&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=2660213026801&frm=20&pv=1&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&ga_fc=0&iag=0&icsg=3332961633064&dssz=60&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21064522%2C21064534&oid=3&pvsid=2472101747094926&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=112
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1569721572&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1569721572349&bpp=4&bdt=230&fdt=108&idt=108&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=2660213026801&frm=20&pv=1&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&ga_fc=0&iag=0&icsg=3332961633064&dssz=60&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21064522%2C21064534&oid=3&pvsid=2472101747094926&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=112
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
test_cookie=CheckForPermission
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
date
Sun, 29 Sep 2019 01:46:12 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT IDE=AHWqTUnPImBARb3y5GXeiIlo5KA5_u_hLccvmKyeY2cCBAeZmm4U8ngI0mZU0OK3; expires=Fri, 23-Oct-2020 01:46:12 GMT; path=/; domain=.doubleclick.net; HttpOnly
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Sun, 29 Sep 2019 01:46:12 GMT
cache-control
private
bootstrap.min.js
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
36 KB
10 KB
Script
General
Full URL
https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-4e25f0b3c7.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:2a , Netherlands, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
/
Resource Hash
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
last-modified
Wed, 12 Dec 2018 18:33:51 GMT
status
200
etag
"1544639631"
vary
Accept-Encoding
x-cache
HIT
content-type
text/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=31536000
x-hello-human
Say hello back! @getBootstrapCDN on Twitter
accept-ranges
bytes
timing-allow-origin
*
content-length
9832
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.0%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.0&cd44=1&cm1=1&z=1862810641
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167015
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/ Frame 585E
30 KB
30 KB
Image
General
Full URL
https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 09 Sep 2019 04:01:55 GMT
x-content-type-options
nosniff
age
1719857
filer-source
ce88ec61ef2b0ae3c6dce1f364e04b3dccdbf411589c67a9af3271f22f2780da
x-cache
HIT
status
200
accept-language
bytes
content-length
30682
x-xss-protection
1; mode=block
last-modified
Sat, 24 Aug 2019 05:59:04 GMT
server
nginx/1.10.3
filer-attr
W1s2NTAsMzY2XSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 23 Sep 2019 05:59:04 GMT
de9e383c-3ca0-4ebc-bc5a-77beb8ec589e
https://videos.giga.de/ Frame 585E
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/de9e383c-3ca0-4ebc-bc5a-77beb8ec589e
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

Request headers

Sec-Fetch-Mode
same-origin
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Length
31
Content-Type
application/javascript
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 585E
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.73.195 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:14 GMT
Last-Modified
Sat, 28 Sep 2019 16:44:03 GMT
Server
AmazonS3
x-amz-request-id
36F8EFCEEAD5FE47
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
jAbpyIemdQkEeXcJUHpSBIeQR+iXQXw5VRg1ODUM6Mqs852idT2GpT2t7HMmpfUdHKXar8J5IOU=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 585E
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Sun, 29 Sep 2019 02:01:12 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 585E
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-52.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:45:54 GMT
Via
1.1 89cb19c6f2c9ed0983294d3b12e80e43.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
19
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:47 GMT
Server
AmazonS3
ETag
"063da71572f57793ea4125f50b418f84"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
X-Amz-Cf-Pop
FRA53-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
VwXe_P7kBNpG7us4TReDRZZmtftFzkGl97CHtTFUZE5GhC3Te3h5hA==
Expires
0
ads
securepubads.g.doubleclick.net/gampad/
11 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4005175598889200&correlator=2194107426730267&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21064522%2C21064534%2C21063636&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190929&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=800x450%7C580x500%7C580x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D3%26yt%3D0%26adset%3Dbrsl%26mbrid%3De6070c614041717261f52ff39904d2c9%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1569721572&dt=1569721572657&dlt=1569721572119&idt=394&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3541345729&uci=1&ifi=2&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=61&icsg=13331846532232&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
cafe /
Resource Hash
bfdb4abddd21ddc48ff54af78b972d5169c900f1e6f2ebe78cd2c7dde190a1e1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
4636
x-xss-protection
0
google-lineitem-id
5002100619
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138265057624
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019091901.js
securepubads.g.doubleclick.net/gpt/
62 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
sffe /
Resource Hash
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24151
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:12 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/
3 KB
2 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4005175598889200&correlator=2194107426730267&output=ldjh&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21064522%2C21064534%2C21063636&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190929&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout-of-page%26adslot%3Dout-of-page%26pc%3D1&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D3%26yt%3D0%26adset%3Dbrsl%26mbrid%3De6070c614041717261f52ff39904d2c9%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1569721572&dt=1569721572669&dlt=1569721572119&idt=394&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858038163&uci=2&ifi=3&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=62&icsg=13331846532232&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&fws=640&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
cafe /
Resource Hash
321ae50d051cba1ca63facbcb5417aff8ab28ebbb9e1c9597d146634df59f430
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
1816
x-xss-protection
0
google-lineitem-id
4482388292
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138216245372
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame C3CC
Redirect Chain
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
0
0
Document
General
Full URL
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.220.16 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash

Request headers

Host
aax-eu.amazon-adsystem.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
ad-id=A2uf9dyP300skCcQZNlRaoQ|t
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Server
Date
Sun, 29 Sep 2019 01:46:13 GMT
Content-Type
text/html;charset=ISO-8859-1
Content-Length
181
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Set-Cookie
ad-id=A2uf9dyP300skCcQZNlRaoQ; Domain=.amazon-adsystem.com; Expires=Wed, 01-Apr-2020 01:46:13 GMT; Path=/; HttpOnly ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Tue, 01-Oct-2024 01:46:13 GMT; Path=/; HttpOnly
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Sun, 29 Sep 2019 01:46:13 GMT
Content-Length
0
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Location
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Set-Cookie
ad-id=A2uf9dyP300skCcQZNlRaoQ|t; Domain=.amazon-adsystem.com; Expires=Wed, 01-Apr-2020 01:46:13 GMT; Path=/; HttpOnly
Vary
User-Agent
loader.js
c.nativendo.de/cdn/asset/js/
53 KB
17 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Requested by
Host: d.nativendo.de
URL: https://d.nativendo.de/cds/delivery/init
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ad0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
8169f1c80996bcbacc8733474b782be494a43f9fcc6e049554bd1e88818f81d6

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
via
1.1 google
cf-cache-status
HIT
age
154807
cf-polished
origSize=54525
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=31536000
cf-ray
51da483578b0cb9c-VIE
expires
Mon, 28 Sep 2020 01:46:12 GMT
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
52 KB
13 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
815599504eb91ce479c1cc73c16f8135d37181ab42a757fd6801fc114cd7d0ec

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:13 GMT
Content-Encoding
gzip
Age
840
X-Cache
HIT
Connection
keep-alive
Content-Length
12793
x-amz-id-2
8YqyrD4YJdWyWwJBnpWQpgctWbE0IETTCNQzOvjvy57Q1qyVM/q1rBE/mArfq/T11QcRBsKxqBc=
X-Served-By
cache-fra19145-FRA
Last-Modified
Sun, 29 Sep 2019 01:22:47 GMT
Server
AmazonS3
X-Timer
S1569721573.002301,VS0,VE0
ETag
"63070abc938ef7f5719f0b88d4f5939f"
x-amz-request-id
E72059D5C0FE79E4
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
111
bid
c.amazon-adsystem.com/e/dtb/
122 B
503 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=2006457546861569721572389&cb=4447879437841569721572704&ws=1600x1200&v=7.36.03&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.151.91 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-151-91.fra53.r.cloudfront.net
Software
Server /
Resource Hash
0bc28bb79161e691cf1f11d550bc064b3b344c9f003c7ed11dcb3d66eb7f5e29

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA53
status
200
vary
Accept-Encoding,User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
132
via
1.1 59c171b9abb6b3c58e72495c539dfa68.cloudfront.net (CloudFront)
x-amz-cf-id
b5hJOdR-9-j6FgPVKumP2biyGDlyHINj_2nXYv7_lqt_lGxheBHCag==
v1
prg.smartadserver.com/prebid/
0
0

v1
prg.smartadserver.com/prebid/
0
0

v1
prg.smartadserver.com/prebid/
0
0

arj
yieldlove-d.openx.net/w/1.0/
4 KB
5 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=ef93a1a3-b0e8-4e71-86e9-408e2b613216%2C481cb0c6-a6f0-49f4-8b5c-dafdf0cdf2a0%2Cbd8d4e19-f203-4888-8169-515153069058&nocache=1569721572712&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle%2Csky%2Cbanner&auid=539390940%2C540714782%2C540847469&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.0 /
Resource Hash
ba853d478c19a251d1c53a5737f23e445fdb82deada85657cd070d88fb3bbc13

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:12 GMT
via
1.1 google
server
OXGW/16.163.0
status
200
vary
Accept
p3p
CP="CUR ADM OUR NOR STA NID"
access-control-allow-origin
https://www.giga.de
cache-control
private, max-age=0, no-cache
access-control-allow-credentials
true
content-type
application/json
alt-svc
clear
content-length
4412
expires
Mon, 26 Jul 1997 05:00:00 GMT
prebid
ib.adnxs.com/ut/v3/
21 B
709 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.173.27 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
539.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:14 GMT
X-Proxy-Origin
109.236.94.21; 109.236.94.21; 539.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.230:80
AN-X-Request-Uuid
36a2dcc3-ce9d-46d3-b850-87c83682af0d
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
cygnus
as-sec.casalemedia.com/
0
0

translator
hbopenbid.pubmatic.com/
0
0

fastlane.json
fastlane.rubiconproject.com/a/api/
0
0

fastlane.json
fastlane.rubiconproject.com/a/api/
0
0

fastlane.json
fastlane.rubiconproject.com/a/api/
0
0

bid
orbidder.otto.de/
0
0

bid
orbidder.otto.de/
0
0

bid
orbidder.otto.de/
0
0

/
adx.adform.net/adx/
15 B
410 B
XHR
General
Full URL
https://adx.adform.net/adx/?rp=4&bWlkPTY2NjQ0MyZ0cmFuc2FjdGlvbklkPWVmOTNhMWEzLWIwZTgtNGU3MS04NmU5LTQwOGUyYjYxMzIxNg%3D%3D&bWlkPTcxMzMyNiZ0cmFuc2FjdGlvbklkPTQ4MWNiMGM2LWE2ZjAtNDlmNC04YjVjLWRhZmRmMGNkZjJhMA%3D%3D&bWlkPTcwNjE1MSZ0cmFuc2FjdGlvbklkPWJkOGQ0ZTE5LWYyMDMtNDg4OC04MTY5LTUxNTE1MzA2OTA1OA%3D%3D&pt=gross&stid=3f61939e-b0b0-43c4-ba51-7071782530d8&fd=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.24 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
631bc9fa39ddcdd4008398e649671ba79db3cc7c1725d7b8cd9823ec243f0a48

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:12 GMT
server
nginx
status
200
access-control-max-age
86400
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
application/json; charset=utf-8
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
content-length
15
expires
-1
adslots.-ecTGK0.gif
www.giga.de/imagez/
71 B
474 B
Image
General
Full URL
https://www.giga.de/imagez/adslots.-ecTGK0.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx / TSAdServer
Resource Hash
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
server
nginx
x-powered-by
TSAdServer
etag
W/"47-ZTbJFDBdJipLHHeF7Zqsus3A1Hc"
content-type
image/png
status
200
cache-control
no-cache, no-store, must-revalidate, no-cache="set-cookie"
x-robots-tag
noindex, nofollow
content-length
71
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame 585E
204 KB
59 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=tYPjcTozvq
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-52.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
50f8753ce2cb3e604ec1bde4aaa9d0c4d0d8096cc313cbd76a7dbe9381c066c0

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:45:22 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
51
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Fri, 27 Sep 2019 11:16:04 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 89cb19c6f2c9ed0983294d3b12e80e43.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Pop
FRA53-C1
X-Amz-Cf-Id
FLbrFFJAXZu388FNuPDf7BiNCAeu1QCBtmNe05YZ-l06Z5pFNOBtSw==
nativendo.css
c.nativendo.de/cdn/asset/css/
5 KB
1 KB
Stylesheet
General
Full URL
https://c.nativendo.de/cdn/asset/css/nativendo.css?v=1170
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ad0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
via
1.1 google
cf-cache-status
HIT
age
154807
cf-polished
origSize=5959
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
text/css;charset=UTF-8
cache-control
public, max-age=31536000
cf-ray
51da4835c8fccb9c-VIE
expires
Mon, 28 Sep 2020 01:46:12 GMT
ads
securepubads.g.doubleclick.net/gampad/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4005175598889200&correlator=2194107426730267&output=ldjh&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21064522%2C21064534%2C21063636&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190929&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A20918.default%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D3%26yt%3D0%26adset%3Dbrsl%26mbrid%3De6070c614041717261f52ff39904d2c9%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1569721572&dt=1569721572804&dlt=1569721572119&idt=394&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3040188762&uci=3&ifi=4&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=65&icsg=53327386128904&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
cafe /
Resource Hash
01c77e3fc7314ff132fd406b05d1d4fc9159c4c05ca1749a214a09fc50a5f0e3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3410
x-xss-protection
0
google-lineitem-id
5158542952
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138288671472
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4005175598889200&correlator=2194107426730267&output=ldjh&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21064522%2C21064534%2C21063636&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190929&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C10x22%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A19051.default%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D3%26yt%3D0%26adset%3Dbrsl%26mbrid%3De6070c614041717261f52ff39904d2c9%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1569721572&dt=1569721572811&dlt=1569721572119&idt=394&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1819065434&uci=4&ifi=5&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=65&icsg=53327386128904&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
cafe /
Resource Hash
2100579855f03986263221fd7500ec5a1f247528c18718598d2a57cbf5ae6494
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3376
x-xss-protection
0
google-lineitem-id
5158542952
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138288671229
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4005175598889200&correlator=2194107426730267&output=ldjh&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21064522%2C21064534%2C21063636&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190929&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A9501.default%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D3%26yt%3D0%26adset%3Dbrsl%26mbrid%3De6070c614041717261f52ff39904d2c9%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1569721572&dt=1569721572818&dlt=1569721572119&idt=394&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3694558186&uci=5&ifi=6&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=65&icsg=53327386128904&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=409114290.1569721572&ga_sid=1569721572&ga_hid=385468335&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
cafe /
Resource Hash
bbfab60e485c027378bb9847f63629235fa4d4120c225ce3fa1451fda4ed3843
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3198
x-xss-protection
0
google-lineitem-id
4766719655
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138241245897
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
truncated
/ Frame 585E
204 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
50f8753ce2cb3e604ec1bde4aaa9d0c4d0d8096cc313cbd76a7dbe9381c066c0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
text/javascript
view
securepubads.g.doubleclick.net/pcs/ Frame 0DC8
0
75 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstCIOxnkOt6SpDRQSGtTN8jKb4wZwyGHYW-uYjHhoqPae32EVXVdcdaNDSffBYZGEUvPAvrIcPCx8tAyDA31PR9aYfyDkHVQ3VNJa1-4GHSRsNyMO5b0kgCAepA9sulUzNMvRuRYLV6qWqWRyfz4dbHJlgdeQBn1dzbsucwAZgO4Pf14gTEtTk_ES8sswt_8OnZsSXbmvZr7fAxifwoxNmHtDL56xTMIJCCBtSui0zGQrSrv2JecV6P4bEGjeOq8hJIfZJPVxW_Yz8djK91Cp0RIA&sig=Cg0ArKJSzOyHyMEVOEVbEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 29 Sep 2019 01:46:12 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
video.php
media.oadts.com/www/delivery/ Frame 0DC8
108 KB
108 KB
Script
General
Full URL
https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
6c7ed2d548e889f2bd271cc326596ba4ad529474c3881bf3fcbc39d8d3213706

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:13 GMT
Cache-Control
private, max-age=0, no-cache
Server
lighttpd/1.4.45
Content-type
text/javascript; charset=UTF-8
Content-Length
110249
Expires
Mon, 26 Jul 1997 05:00:00 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 0DC8
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
40c4598498d723f4f7406649ed88cba3ae85afbbb863e97b2723174e22b2381a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569582964828766"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29649
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:12 GMT
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame 41D2
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssauCih4skiwSFpI4ZsUywJamwKtedB1IHdGqYfsiknYq0Gy4O0CojWqjsbuAMMR4uA6o44z6EDtJcSCCYiKvCF5MJlyQUVEVmei9DkvI07HnjHqfT11Me-Wna2jsDs5JSeHGKWspqqy...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
343 B
Image
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:194::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:12 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
status
200
etag
"3260aadd174a1ebd50d0bd967c8fadea:1538746302"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
access-control-allow-origin
*
cache-control
max-age=400692
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Thu, 03 Oct 2019 17:04:24 GMT

Redirect headers

timing-allow-origin
*
date
Sun, 29 Sep 2019 01:46:12 GMT
x-content-type-options
nosniff
server
cafe
status
302
location
//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
text/html; charset=UTF-8
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
/
d.nativendo.de/cds/delivery/get/
6 KB
2 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/get/?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
4793266fb23f100b86f57ba198771815ce48ec3b6c3c2de6bde42e9f030787d2

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:12 GMT
content-encoding
gzip
last-modified
Sun, 29 Sep 2019 01:46:12 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
1131
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
native
native.adscale.de/
157 B
603 B
XHR
General
Full URL
https://native.adscale.de/native
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.246.233 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-246-233.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
b15975ae95b0cbf15adf1ff8e77790fc0b4cb1f5f9b938f3c79abe2dda73e43d

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

Date
Sun, 29 Sep 2019 01:46:13 GMT
P3P
CP=NOI PSA OUR
Content-Type
application/json
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Robots-Tag
none
Content-Length
157
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201909241602/
25 KB
10 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
994c75c7c155810e924895ddf706066b1dc59153d7e1697990ba915768c2d669

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:13 GMT
Content-Encoding
gzip
Age
603
X-Cache
HIT
Connection
keep-alive
Content-Length
9777
x-amz-id-2
VVBZnwaacEGmH5sUn6/NG+U6K9IZpdY6Pji+ko77du9JUY0/ZEH0u46e+wLtO3USoZyFsGPGIBg=
X-Served-By
cache-fra19145-FRA
Last-Modified
Wed, 25 Sep 2019 15:51:28 GMT
Server
AmazonS3
X-Timer
S1569721573.042961,VS0,VE0
ETag
"b3c76d127b9f61ef36f5b10abdbf07e9"
x-amz-request-id
E9DB25B5658DC138
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
92
view
securepubads.g.doubleclick.net/pcs/ Frame 4DFC
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvI9FM-Il3AQzw4GUPoVyvMH8UuvDcCv5xsKr0dvFnzj2i4zU5G88uloHEiNbflkSjv7_GJY309PPo7Kx2jG5vE_jI_BGyX7TcDem6J6TYAV1L6sjewBW8CbC3vwii7l2Xmrzbmq1LHWYcP8PpQxdOYH9ViRlXKXYDDHg1ag7jSIjkR-P4Ycye6umCJBgCbi1VNdho8jP-ptYAcEKFwXnMseAnF9kan8SLj6T68TVTvP4O5SkRuG2IOQ2j_cy46iXEX5BuIojWyl0PWWlqtsKWplPx4L7oIgvi6Q_Co&sig=Cg0ArKJSzKahW4RyKFWdEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 29 Sep 2019 01:46:13 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
itfudnuj.js
ad4m.at/ Frame 4DFC
50 KB
15 KB
Script
General
Full URL
https://ad4m.at/itfudnuj.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash
a7792edb768c278732eafdfea1e48c35214ddcf3362046bef8927bc6ad1de0cf

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 00:56:57 GMT
content-encoding
gzip
age
2956
x-guploader-uploadid
AEnB2UrRSb2SPdFtbTPFMtaqCDcRwQKFIWMm2rmiwRedsqvkcipVIAnqIkQCQ_L9Tk0WM2bZWXr_5s_AsCLwPZj9aaf5_biYMyHOZoG9LHQIL_pBEovR_Yk
x-goog-storage-class
MULTI_REGIONAL
status
200
x-goog-metageneration
1
x-goog-stored-content-encoding
gzip
alt-svc
clear
content-length
14394
last-modified
Wed, 25 Sep 2019 14:03:05 GMT
server
UploadServer
etag
"0a70e312e677e21dd47f54aced680134"
x-goog-hash
crc32c=Tez3Kg==, md5=CnDjEuZ34h3Uf1Ss7WgBNA==
x-goog-generation
1569420185603011
cache-control
public, max-age=3600, no-transform
x-goog-stored-content-length
14394
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
expires
Sun, 29 Sep 2019 01:56:57 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 4DFC
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
40c4598498d723f4f7406649ed88cba3ae85afbbb863e97b2723174e22b2381a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569582964828766"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29649
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:13 GMT
truncated
/ Frame 4DFC
216 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
a238e48b9d384a69c48822e5c6579cb05b63b69665a2203612af92043d4e9f87

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
frame.html
ad4m.at/ Frame 997D
0
0
Document
General
Full URL
https://ad4m.at/frame.html
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash

Request headers

:method
GET
:authority
ad4m.at
:scheme
https
:path
/frame.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
x-guploader-uploadid
AEnB2UohD0Ef_p2NQvuYg_liPwhXUi-dCjZt8Ljv6z_n5K7zJI6zpmoVEEJdtSWWlPRx96uAgNo8YSeAN787_uvPAhmowiU43YXqYIx33hl2OUo27ezwcI0
date
Sat, 28 Sep 2019 14:10:01 GMT
expires
Sun, 29 Sep 2019 14:10:01 GMT
last-modified
Thu, 11 Oct 2018 08:50:29 GMT
etag
"ad2f98a9fd46a0250dabddf7805fe3d2"
x-goog-generation
1539247829792189
x-goog-metageneration
4
x-goog-stored-content-encoding
utf-8
x-goog-stored-content-length
1570
content-type
text/html
content-encoding
utf-8
content-language
en
x-goog-hash
crc32c=P/mrYg== md5=rS+Yqf1GoCUNq933gF/j0g==
x-goog-storage-class
MULTI_REGIONAL
accept-ranges
bytes
content-length
1570
server
UploadServer
age
41772
cache-control
public, max-age=86400
alt-svc
clear
view
securepubads.g.doubleclick.net/pcs/ Frame 8E2D
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstBbK0W8zZBEQyHQzp4azhJ128V7sgK2iL7tZX-P0CGuy-o89AEuzGY6K0ZkgUvtL3quNULiZ9o0k-v3Tg5End_Fkkp2wGLvlWUadvcA-hxYeR1WX4VVg8cEeQ27WNEbu-yVFBlSFdY1osei4WU4h4yjw8RPiwipbPRMSG4ho5-ZrzmiGN07kmwrmDbFFtDSAHSddPLtRHLiaZEticlI6oFdake6EwAbEQ4PcvYcPotd5ozAsCjMvkO3RtPNF_lkKMWIspWhXs-a-1X54GJ-DxewWmJVYQyhkrCaDJB&sig=Cg0ArKJSzG6Q-PVgiVfSEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 29 Sep 2019 01:46:13 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
itfudnuj.js
ad4m.at/ Frame 8E2D
50 KB
14 KB
Script
General
Full URL
https://ad4m.at/itfudnuj.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash
a7792edb768c278732eafdfea1e48c35214ddcf3362046bef8927bc6ad1de0cf

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 00:56:57 GMT
content-encoding
gzip
age
2956
x-guploader-uploadid
AEnB2UrRSb2SPdFtbTPFMtaqCDcRwQKFIWMm2rmiwRedsqvkcipVIAnqIkQCQ_L9Tk0WM2bZWXr_5s_AsCLwPZj9aaf5_biYMyHOZoG9LHQIL_pBEovR_Yk
x-goog-storage-class
MULTI_REGIONAL
status
200
x-goog-metageneration
1
x-goog-stored-content-encoding
gzip
alt-svc
clear
content-length
14394
last-modified
Wed, 25 Sep 2019 14:03:05 GMT
server
UploadServer
etag
"0a70e312e677e21dd47f54aced680134"
x-goog-hash
crc32c=Tez3Kg==, md5=CnDjEuZ34h3Uf1Ss7WgBNA==
x-goog-generation
1569420185603011
cache-control
public, max-age=3600, no-transform
x-goog-stored-content-length
14394
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
expires
Sun, 29 Sep 2019 01:56:57 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 8E2D
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
40c4598498d723f4f7406649ed88cba3ae85afbbb863e97b2723174e22b2381a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569582964828766"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29649
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:13 GMT
frame.html
ad4mat.net/ Frame D568
0
0
Document
General
Full URL
https://ad4mat.net/frame.html
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
146.148.127.183 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
183.127.148.146.bc.googleusercontent.com
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
ad4mat.net
:scheme
https
:path
/frame.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx
date
Sun, 29 Sep 2019 01:46:13 GMT
content-type
text/html
etag
W/"5acf0fb7-57f"
content-encoding
gzip
truncated
/ Frame 8E2D
211 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b5db109474e1066ef7c6f59629678aa48eea57d3dbac37fc2392da925ef82231

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
frame.html
ad4m.at/ Frame A7D7
0
0
Document
General
Full URL
https://ad4m.at/frame.html
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash

Request headers

:method
GET
:authority
ad4m.at
:scheme
https
:path
/frame.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
x-guploader-uploadid
AEnB2UohD0Ef_p2NQvuYg_liPwhXUi-dCjZt8Ljv6z_n5K7zJI6zpmoVEEJdtSWWlPRx96uAgNo8YSeAN787_uvPAhmowiU43YXqYIx33hl2OUo27ezwcI0
date
Sat, 28 Sep 2019 14:10:01 GMT
expires
Sun, 29 Sep 2019 14:10:01 GMT
last-modified
Thu, 11 Oct 2018 08:50:29 GMT
etag
"ad2f98a9fd46a0250dabddf7805fe3d2"
x-goog-generation
1539247829792189
x-goog-metageneration
4
x-goog-stored-content-encoding
utf-8
x-goog-stored-content-length
1570
content-type
text/html
content-encoding
utf-8
content-language
en
x-goog-hash
crc32c=P/mrYg== md5=rS+Yqf1GoCUNq933gF/j0g==
x-goog-storage-class
MULTI_REGIONAL
accept-ranges
bytes
content-length
1570
server
UploadServer
age
41772
cache-control
public, max-age=86400
alt-svc
clear
frame.html
ad4mat.net/ Frame 9ECE
0
0
Document
General
Full URL
https://ad4mat.net/frame.html
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
146.148.127.183 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
183.127.148.146.bc.googleusercontent.com
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
ad4mat.net
:scheme
https
:path
/frame.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx
date
Sun, 29 Sep 2019 01:46:13 GMT
content-type
text/html
etag
W/"5acf0fb7-57f"
content-encoding
gzip
le.php
media.oadts.com/www/delivery/ Frame 0DC8
43 B
410 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=9&cb=96912259004
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:13 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 0DC8
43 B
410 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=10&cb=93056958995
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:13 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 0DC8
43 B
410 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=11&cb=53075463417
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:13 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
avc.php
media.oadts.com/www/delivery/ Frame 0DC8
12 KB
12 KB
XHR
General
Full URL
https://media.oadts.com/www/delivery/avc.php?zoneid=5074&pw=100%25&ph=100%25&msgId=atg5932945953&startmuted=1&cb=0.9842060292478423&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&autostart=1
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
992f08d6815756429915fd99c7ba4a6a0c74999fa6923eed08a89da60f26aeb1

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:13 GMT
Server
lighttpd/1.4.45
Access-Control-Max-Age
86400
P3P
CP="CUR ADM OUR NOR STA NID"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, max-age=0, no-cache
Access-Control-Allow-Credentials
true
Content-type
application/json
Content-Length
11803
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 0DC8
43 B
410 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=12&cb=76888212234
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:13 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
rar
ad4m.at/ad/ Frame 5580
Redirect Chain
  • https://ad4m.at/rs?a=&b=40&c=680&d=&e=728&f=90&g=0&h=Stroeer_RON_728x90&i=&j=1065&k=1&l=&m=&n=
  • https://ad4m.at/ad/rar?a=13521&b=oneid9BRsMfmfYxDFKHesQu7trAQagoneid__asuid0asuid__Stroeer_RON_728x90&f=oneid1jWSbfKfYq8F9H5sBupC2WqcMoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=39a78d66...
0
0
Document
General
Full URL
https://ad4m.at/ad/rar?a=13521&b=oneid9BRsMfmfYxDFKHesQu7trAQagoneid__asuid0asuid__Stroeer_RON_728x90&f=oneid1jWSbfKfYq8F9H5sBupC2WqcMoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=39a78d667f4dbfdbed691c287ab9686e%2F15862427415644907066&i=20612&j=16&k=0&y=0&z=0
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
nginx /
Resource Hash
Security Headers
Name Value
Content-Security-Policy block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups
Strict-Transport-Security max-age=86400; includeSubDomains; preload
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
ad4m.at
:scheme
https
:path
/ad/rar?a=13521&b=oneid9BRsMfmfYxDFKHesQu7trAQagoneid__asuid0asuid__Stroeer_RON_728x90&f=oneid1jWSbfKfYq8F9H5sBupC2WqcMoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=39a78d667f4dbfdbed691c287ab9686e%2F15862427415644907066&i=20612&j=16&k=0&y=0&z=0
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx
date
Sun, 29 Sep 2019 01:46:13 GMT
content-type
text/html; charset=UTF-8
content-length
1501
vary
Accept-Encoding
report-to
{"endpoints":[{"url":"/ad/violation-report-endpoint"}],"group":"report-endpoint","max_age":86400}
content-security-policy
block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups
cache-control
no-store, no-cache, must-revalidate, proxy-revalidate
expires
0
feature-policy
autoplay 'self';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';midi 'none';payment 'none';sync-xhr 'none';usb 'none';vr 'none'
pragma
no-cache
referrer-policy
no-referrer
strict-transport-security
max-age=86400; includeSubDomains; preload
surrogate-control
no-store
x-content-type-options
nosniff
x-download-options
noopen
x-xss-protection
1; mode=block
nel
{"failure_fraction":"1.0","max_age":86400,"report_to":"report-endpoint","success_fraction":"0.0"}
x-fastcgi-cache
BYPASS
x-backend-server
adsrv-rc7d
via
1.1 google
alt-svc
clear

Redirect headers

status
307
server
nginx
date
Sun, 29 Sep 2019 01:46:13 GMT
location
https://ad4m.at/ad/rar?a=13521&b=oneid9BRsMfmfYxDFKHesQu7trAQagoneid__asuid0asuid__Stroeer_RON_728x90&f=oneid1jWSbfKfYq8F9H5sBupC2WqcMoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=39a78d667f4dbfdbed691c287ab9686e%2F15862427415644907066&i=20612&j=16&k=0&y=0&z=0
cache-control
private, no-store, max-age=0
x-fastcgi-cache
BYPASS
x-backend-server
rs-t9gn
via
1.1 google
alt-svc
clear
rar
ad4m.at/ad/ Frame B6E2
Redirect Chain
  • https://ad4m.at/rs?a=&b=38&c=680&d=&e=160&f=600&g=0&h=Stroeer_RON_160x600&i=&j=1065&k=1&l=&m=&n=
  • https://ad4m.at/ad/rar?a=13523&b=oneid8gQhDf8fZ2dagHQs3uxtkMKHEoneid__asuid0asuid__Stroeer_RON_160x600&f=oneidZzQSwfBf86YamHxs5uDCJ4zT2oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=bc454...
0
0
Document
General
Full URL
https://ad4m.at/ad/rar?a=13523&b=oneid8gQhDf8fZ2dagHQs3uxtkMKHEoneid__asuid0asuid__Stroeer_RON_160x600&f=oneidZzQSwfBf86YamHxs5uDCJ4zT2oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=bc4545a990083d694bdb4b78988c6de0%2F15773067486453054862&i=20612&j=16&k=0&y=0&z=0
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
nginx /
Resource Hash
Security Headers
Name Value
Content-Security-Policy block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups
Strict-Transport-Security max-age=86400; includeSubDomains; preload
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
ad4m.at
:scheme
https
:path
/ad/rar?a=13523&b=oneid8gQhDf8fZ2dagHQs3uxtkMKHEoneid__asuid0asuid__Stroeer_RON_160x600&f=oneidZzQSwfBf86YamHxs5uDCJ4zT2oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=bc4545a990083d694bdb4b78988c6de0%2F15773067486453054862&i=20612&j=16&k=0&y=0&z=0
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx
date
Sun, 29 Sep 2019 01:46:13 GMT
content-type
text/html; charset=UTF-8
content-length
1512
vary
Accept-Encoding
report-to
{"endpoints":[{"url":"/ad/violation-report-endpoint"}],"group":"report-endpoint","max_age":86400}
content-security-policy
block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups
cache-control
no-store, no-cache, must-revalidate, proxy-revalidate
expires
0
feature-policy
autoplay 'self';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';midi 'none';payment 'none';sync-xhr 'none';usb 'none';vr 'none'
pragma
no-cache
referrer-policy
no-referrer
strict-transport-security
max-age=86400; includeSubDomains; preload
surrogate-control
no-store
x-content-type-options
nosniff
x-download-options
noopen
x-xss-protection
1; mode=block
nel
{"failure_fraction":"1.0","max_age":86400,"report_to":"report-endpoint","success_fraction":"0.0"}
x-fastcgi-cache
BYPASS
x-backend-server
adsrv-rc7d
via
1.1 google
alt-svc
clear

Redirect headers

status
307
server
nginx
date
Sun, 29 Sep 2019 01:46:13 GMT
location
https://ad4m.at/ad/rar?a=13523&b=oneid8gQhDf8fZ2dagHQs3uxtkMKHEoneid__asuid0asuid__Stroeer_RON_160x600&f=oneidZzQSwfBf86YamHxs5uDCJ4zT2oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=bc4545a990083d694bdb4b78988c6de0%2F15773067486453054862&i=20612&j=16&k=0&y=0&z=0
cache-control
private, no-store, max-age=0
x-fastcgi-cache
BYPASS
x-backend-server
rs-sv2g
via
1.1 google
alt-svc
clear
getAd
video-adserver.ibillboard.com/ Frame 0DC8
1 KB
1 KB
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=fff9202189&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
f4ffa7a21c597e7e3cf7c6153357a50abf76c7ee4df2ff5c67316b9d2c559fb7

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:14 GMT
Server
ibillboard
Vary
*
Content-Type
text/xml
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
1033
Expires
Tue, 01 Jan 1991 00:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 0DC8
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=23481&eventId=21&plr=3&cb=0.02864188777228005&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dur=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:13 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
userconnect.js
js.adscale.de/
13 KB
5 KB
Script
General
Full URL
https://js.adscale.de/userconnect.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
QigX3ZX5MGiAmAJwYlP84.EpHqCiK9Yx
Content-Encoding
gzip
Last-Modified
Thu, 05 Sep 2019 23:46:39 GMT
Server
AmazonS3
x-amz-request-id
31BE18F60EE95BB3
ETag
"5378ec64224df70177fba5bf02e1eb95"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Sun, 29 Sep 2019 01:46:14 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4106
x-amz-id-2
IdaVAl1604pfq6JwXhPQZmq7SpSyJoUJfwVVhRXUnMBWynW8rBQqVfzyqc7y5KqDybLXGD8qdIs=
019287de-ce6f-4575-bf9d-765f700cdcaa
t.nativendo.de/cds/tracking/event/
0
169 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/019287de-ce6f-4575-bf9d-765f700cdcaa?aid=182yo&floor=MDE5Mjg3ZGUtY2U2Zi00NezMHDX26P6ubAqTBw&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1569721573
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:13 GMT
via
1.1 google
last-modified
Sun, 29 Sep 2019 01:46:13 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
019287de-ce6f-4575-bf9d-765f700cdcaa
t.nativendo.de/cds/tracking/event/
0
194 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/019287de-ce6f-4575-bf9d-765f700cdcaa?aid=182yo&t=data%2Finventory&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1569721573
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:13 GMT
via
1.1 google
last-modified
Sun, 29 Sep 2019 01:46:13 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 585E
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=7192628223
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHNob2hWb29ucGl1TmVhZ2k9c2hvaFZvb25waXVOZWFnaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuVWV8fCh5LlVlPTApO3kuVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5abillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5jZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS51dChsKTthLnR0KG0pO2EuY3QoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGE9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5DdCh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzFdO3RoaXMucHM9dGhpcy5hWzRdO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuSHE9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy56bz1iO2IucHJvdG90eXBlPXtZbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmw6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVvOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSHE6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy56b3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWm49ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5vZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLk5zLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5UZz17fTt0aGlzLmVmPSExfWMuWWo9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrCnRoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5UZ1thXSYmKHRoaXMuVGdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5hdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGFuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmCihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxsYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sTnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuTXMoYS5kYXRhKX0sTXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxoZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSwKcWc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMubGgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LElnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFptOmZ1bmN0aW9uKGEsCmIpe2lmKGImJiEoMD50aGlzLndhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuRXAoYSkpcmV0dXJuOyhiPXRoaXMucWcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxFcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx5ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZ2I6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfY2FjaGVfIithLGIsITApfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seWU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxIZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUWg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sCkhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixmLGQ7Zm9yKGY9NzswPD1mO2YtLSlkPWE+Pj40KmYmMTUsaCs9ZC50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHgsdSxyLHA7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgdD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx0LnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IodC5wdXNoKGYpOzE0IT10Lmxlbmd0aCUxNjspdC5wdXNoKDApO3QucHVzaChuPj4+MjkpO3QucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx0Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXRbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eD1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspcD1kKHEsNSkrKG4meHx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9MjA7Mzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTQwOzU5Pj1mO2YrKylwPWQocSw1KSsobiZ4fG4mdXx4JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eCwKeD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NjA7Nzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreCY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxoZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cSkmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxIazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LFBuOmZ1bmN0aW9uKCl7cmV0dXJuIGEuUWkoKXx8YS5jaigpfHxhLm5xKCl8fGEubGwoKXx8YS5ybSgpfHxhLkhrKCl8fGEuUGwoKX19O3JldHVybiBudWxsIT1hLlBuKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sQ2M6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sQWE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sWHA6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEdvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LFZ0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LERnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5kaShiKSsiOiIrdGhpcy5kaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGdmOmZ1bmN0aW9uKGEpe3RoaXMuJGI9YX0sQWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy4kYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKQWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkFnKGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQWMoQil9LFBzOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuWHAoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxXdDpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlBzKGEpO2lmKGIpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5CZCgpO2wueWEoYSwhMCk7YT1sLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuS2EoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLk5jfHwodGhpcy5OYz17fSk7dGhpcy5OY1tmXXx8KHRoaXMuTmNbZl09MCk7dGhpcy5OY1tmXSsrOzEwPHRoaXMuTmNbZl18fChmPQpsLkJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZil7dmFyIGQ9ITE7Zj1mLnJlc3BvbnNlVGV4dDt0cnl7Zj1KU09OLnBhcnNlKGYpLGY9Zi5kYXRhLGZbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGQ9ITApLGZbMV0mJmZbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGQ9ITEpfWNhdGNoKGMpe31kfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZlswXT9mWzBdOiIiKSsoZlsxXT9mWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LApNZTpmdW5jdGlvbigpe2wmJmwuWT9sLmlzRW5hYmxlZCYmbC5rbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxlZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuJHEoYSl8fDA8PQphLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZGYmJndpbmRvdy5zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueWcoYSkpcmV0dXJuIHRoaXMueWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTsKYy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkphLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlptKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIG09ZXx8bDtlPSEwO2smJihlPSExKTtpZihtJiZtLlkpaWYobS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle20ueWEoYSxlKTtlPW0ueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbS5LYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLG0sZyxrKX0uYmluZCh0aGlzKSw1MDApfSxsaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sRHI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMubGgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTGMpZm9yKHZhciBjIGluIHRoaXMuTGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5MY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sbWg6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuSmEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkRyKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkxjPWF9LFV2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxRbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFVxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLllqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlhqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuRHM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLAptZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLlRyPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJ2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5XZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi4kZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlJtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlVmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuZHY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlNyPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9wPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Fdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIiwKbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi52bz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5jZD17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWWY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLlRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5UYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9OwpiLmNlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5TbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iua2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnVkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5uZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuQXY9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9OwpiLiR1PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Vcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbNl07dGhpcy4kbz10aGlzLmFbOF07CnRoaXMubXA9dGhpcy5hWzFdO3RoaXMueW09dGhpcy5hWzNdO3RoaXMuaXA9dGhpcy5hWzhdO3RoaXMuR249dGhpcy5hWzEwXTt0aGlzLnRzPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMuUHI9YjtiLnByb3RvdHlwZT17bnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9yOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubXA6dGhpcy54bShhKX0seG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnltOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pcDp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR246dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5Qcnx8CmphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLm5yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuWmo9YjtiLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxTcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sbGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmxkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMubGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxqYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsKIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamEoKSsiMiJ9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5TcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlpqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkR2PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuWXI9YjtiLnByb3RvdHlwZT17Q3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkR2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuWXJ8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkN2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5qaj1ifSkoYyk7dmFyIEw9Yy5qanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xbz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnlvPWI7Yi5wcm90b3R5cGU9e1ZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlluOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnlvfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Wbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLnRsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5JYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnZ0KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpOjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGNmOmZ1bmN0aW9uKCl7dGhpcy5JYj0KMH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHZ0OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5paCYmTS4kdChiKX0sSHc6ZnVuY3Rpb24oKXtyZXR1cm4gZS55ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LFZxOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy50bHx8cDsoZnVuY3Rpb24oYyl7Yy52bD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPQp0aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5JYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5DYj0iIjt0aGlzLnNnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxJdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LHl0OmZ1bmN0aW9uKGIpe3RoaXMuUGU9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZX0sT2U6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD0KdGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkljKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEdnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGF4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmhxKCl8fHRoaXMuVm0oKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sVm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sCkVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxKZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkNiPWJ9LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2J9LApHaDpmdW5jdGlvbigpe3RoaXMuQ2I9bnVsbH0sTHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkNiJiYoYj0hMCk7cmV0dXJuIGJ9LFd3OmZ1bmN0aW9uKCl7dGhpcy5zZ3x8KHRoaXMuc2c9ITApfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxDdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy52bHx8dDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLk5mPSIxIjt0aGlzLk9mPSIyIjt0aGlzLkttPSIzIjt0aGlzLlBjPTA7dGhpcy5waD0zMDt0aGlzLlJiPVtdO3RoaXMuaGI9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5hZz10aGlzLmdpPQohMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5oZihiKTt0aGlzLnd0KGEpfSxmOmZ1bmN0aW9uKCl7fSxwYTpmdW5jdGlvbigpe3RoaXMuZ2l8fCh0aGlzLmdpPSEwLGUuTWUoKSl9LFRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sTXE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmphKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5qZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuTXEoKTtpZighdGhpcy5TcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5qZigpO3JldHVybn10aGlzLmpmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy4kaCgpO3RoaXMuYWc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMudmEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmhiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSwkaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJgoodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0samY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9mfSxEdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLkttfSxuYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LFRmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSxzdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5PZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUGN9LGhmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnVpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllvPXRoaXMuYVsxXTt0aGlzLkxsPXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLlhsPXRoaXMuYVs2XTt0aGlzLlJ2PXRoaXMuYVs1XTsKdGhpcy5Bbj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLnpqPWI7Yi5wcm90b3R5cGU9e1hvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Zbzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5YbDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnY6dGhpcy56bihhKX0sem46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy56anx8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuWG8oNCk7CihmdW5jdGlvbihjKXtjLkRqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuRGp8fG9hOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLAphPWIudHc7YT9hLm9hP2Eub2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5Fanx8cGE7KGZ1bmN0aW9uKGMpe2MuRmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuRmp8fHFhOyhuZXcgcWEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Mbz10aGlzLmFbNl07CnRoaXMueW49dGhpcy5hWzldO3RoaXMuY3M9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zcD1iO2IucHJvdG90eXBlPXtLbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTG86dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLnNwfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5Lbyg0KTsoZnVuY3Rpb24oYyl7Yy5zaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMueGcoKTt0aGlzLnpnKCk7dGhpcy51bz0hMX0seGc6ZnVuY3Rpb24oKXt0aGlzLmJjPQohMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0semc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpOwphLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5za3x8c2E7KGZ1bmN0aW9uKGMpe2Mucms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMTt0aGlzLmdldFBsYXllcigpOwp2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLndiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy53Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy53Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMud2I9ITApKTp0aGlzLnYoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMucGgmJgohdGhpcy52YSgpJiYodGhpcy53Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudmEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnVvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiYoYS54ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudigib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMudmEoKSYmKHRoaXMud2I/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlNjLmluZGV4T2YoYSkmJgp0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5TYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sR3I6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUWgoYS52aWRlb1RhZyk/YS5iYz90aGlzLnYoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlJjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnhnKCksYS56ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5ya3x8dGE7KGZ1bmN0aW9uKGMpe2MudGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlZxKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmYoKSl9fXRoaXMuVCgpfX0sRXc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5wOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS55YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy50a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzVdfWMudW09YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ObTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudW18fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLk1tKDQpOyhmdW5jdGlvbihjKXtjLmltPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5WKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuaW18fHhhOyhmdW5jdGlvbihjKXtjLmhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPXRoaXMuV2M9ITE7dGhpcy5DaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudGM9dGhpcy5YZz0hMTt0aGlzLlJyKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5zaCgpLHRoaXMuZm8oKSx0aGlzLnJiKCkpfSxScjpmdW5jdGlvbihiKXtyZXR1cm4gZS5BYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwKIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlgsIjsiLHR5cGVvZiBiLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWD9iLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlg/dHlwZW9mIGIuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6CiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KPwp0eXBlb2YgYi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNoKX0semI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJgoodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYj10aGlzLnpiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sS2c6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy56YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxUcTpmdW5jdGlvbigpe2lmKCF0aGlzLldnKXt2YXIgYj0KdGhpcy56YigpLGE9dGhpcy5ScSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuV2c9ITApfXJldHVybiB0aGlzLldnfSxScTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuV2MmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLldjPSEwKTtyZXR1cm4gdGhpcy5XY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuJHMoKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sJHM6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuS2coKTtpZihifHx0aGlzLnZhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0KITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZmEoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxEdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGcmJmIuYWRzJiYodGhpcy5wZz1iLmFkcyk7cmV0dXJuIHRoaXMucGd9LGZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApOwp0aGlzLnMoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLktnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuVHEoKSl7dmFyIGE9dGhpcy56YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnpiKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuemIoKX1lbHNlIHRoaXMuWGc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy56YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6KHRoaXMuZmEoITApLHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSw1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGhvOmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMueWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnljIT1iLmFkcy5zdGF0ZSYmKHRoaXMueWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLnljKXt0aGlzLnYoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMueWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhvKCl9LmJpbmQodGhpcyksMTApfSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxDYTpmdW5jdGlvbigpezA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnZhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sCm9vOmZ1bmN0aW9uKCl7dGhpcy5Nd3x8KDEwPHRoaXMubXY/KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5tdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmd0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9vKCl9LmJpbmQodGhpcyksNTApKSl9LGd0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm52KXt0aGlzLm52PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuaG18fHlhOyhmdW5jdGlvbihjKXtjLmptPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5SaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUmgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUmg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLkljKX19KX0pKGMpO3ZhciB6YT1jLmptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMucHE9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuRnA9YjtiLnByb3RvdHlwZT17QWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FaTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkZwfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuQWooNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxKczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkNiLGg9dGhpcy5rYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7dmFyIENhPWMucWx8fENhOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZWF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIucygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnphKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy50cD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnRwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuSnMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMucGx8fERhOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5tYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLnJsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuZG09dGhpcy5hWzddO3RoaXMuQms9dGhpcy5hWzEwXTt0aGlzLmtuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMubnQ9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG06dGhpcy5BayhhKX0sQWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJrOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT0KYy5udHx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2Mudm4oNCk7KGZ1bmN0aW9uKGMpe2Muams9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuSGcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5Mcz1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0OwpoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkxzKXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuamQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmpkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5qZCl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG5vOmZ1bmN0aW9uKCl7ZS5kaCh0aGlzLmpkKTtlLkZlKHRoaXMuamQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSwKSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmprfHxIYTsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zKCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5pa3x8SWE7KGZ1bmN0aW9uKGMpe2Mua2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuSGcoYiwiZWxlbWVudElEIik7aWYoZS5kaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIEphPWMua2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ebz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLm9sPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMub2x8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkNvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy4kaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT0KYX0seHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLiRqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZmI9YTt0aGlzLkNnPXRoaXMub2k9ITE7dGhpcy50aD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZmI9bmV3IHooYSkpO3ZhciBjPXRoaXMudGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuZmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UueHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmFrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkNnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdHJ5e3RoaXMuU2g/dGhpcy50Yi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMub2l8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy50Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuSWUodGhpcy5mYi51cmwpP2wuTmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5JZSh0aGlzLmZiLnVybCksdGhpcy50aCYmdGhpcy50aCgpfXJldHVybiB0aGlzLnRifX19KShjKTt2YXIgTWE9Yy5ha3x8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPQp0aGlzLldkPSExfWMua2o9YjtiLnByb3RvdHlwZT17QnQ6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxBdDpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGV0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17YXc6IkFkQ2xpY2tUaHJ1IixjdzoiQWRFcnJvciIsZHc6IkFkU3RvcHBlZCIsZ3c6IkFkTGluZWFyQ2hhbmdlIixodzoiQWRUYWdQYXJzZWQiLGx3OiJBZFZpZGVvQ29tcGxldGUiLHB3OiJBZExvYWRlZCIscXc6IkFkU2tpcHBlZCIscnc6IkFkU3RhcnRlZCIsZXc6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdzoiQWRJbXByZXNzaW9uIixidzoiQWRDcmVhdGl2ZVZpZXciLGl3OiJBZFZpZGVvTWlkcG9pbnQiLGt3OiJBZFBhdXNlZCIsCm53OiJBZFZpZGVvU3RhcnQiLG93OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGR0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5WZClmb3IodmFyIGIgaW4gdGhpcy5GYS5WZCl0aGlzLkZhLlZkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5WZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYS5nZXRFcnJvcigpOwphJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuZXQoKTt0aGlzLkZhJiZ0aGlzLmR0KCl9fX0pKGMpO3ZhciBOYT1jLmtqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmplPXRoaXMudmM9dGhpcy54Yj1udWxsO3RoaXMuSG89dGhpcy5KYj10aGlzLmtoPSExO3RoaXMuSmE9IiI7dGhpcy5maD0hMTt0aGlzLnVhPXRoaXMub2Q9IiI7dGhpcy5haD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLkJhPVtdO3RoaXMuUWc9dGhpcy5mYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuS2Q9W107dGhpcy5nYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRGM9ITE7dGhpcy5wbz10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLmxjPXRoaXMudWc9dGhpcy53Zj10aGlzLk5kPXRoaXMubGU9dGhpcy5RYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnBkPTA7dGhpcy5TZz0hMTt0aGlzLlJnPTFFMzt0aGlzLlljPSExO3RoaXMuUWE9MUUzO3RoaXMuUWY9IiJ9Yy5iaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLndjLGFkdGFnbW9kaWZpZXI6dGhpcy54YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMudmMsCmFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5raCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5Ibyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLmZoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLnVhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5haCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5mYyxob21hZEFkcGF0aDp0aGlzLlFnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5JZixIT01BRF9CTE9DS0VEOnRoaXMuR2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMubmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLkhmLHRlc3RIaWRlOnRoaXMuaGMsdGVzdFRhZ3M6dGhpcy5pYyx0ZXN0VGFnc0pTOnRoaXMuamMsCnRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLnBvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubGMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5ZYyxhZEZhbGxiYWNrVVJMOnRoaXMuUWZ9fSxmcTpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYKMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLlFuKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLndhKGEpO2Y/KHRoaXMucmQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuQmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy53Y3x8dGhpcy54Ynx8dGhpcy52Y3x8dGhpcy5qZSkmJihnPXRoaXMuTXIoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5QcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHJkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sUHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIueXc7cmV0dXJuIm5vbmUifSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuS2hdfSxCZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMucWQoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0scWg6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS53YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucWgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLnFoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LE1yOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLnhiKWZvcih2YXIgYiBpbiB0aGlzLnhiKXRoaXMueGIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueGJbYl0pKTt0aGlzLnZjJiYoYT10aGlzLkxyKGEsdGhpcy52YykpO3JldHVybiBhfSxtbzpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5pbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxpbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuQnQoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkF0KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLmZoPSEwO3RoaXMub2Q9YTt0aGlzLnVhPWI7dGhpcy5hZj0KZDt0aGlzLlBkPWY7dGhpcy56Yz1jO3RoaXMuRGE9ZXx8e307dGhpcy5tbygpO3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy5BcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9Yix0aGlzLnhjKCl9Y2F0Y2goayl7dGhpcy5oYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy5vZCt0aGlzLmdlKCJnbG9iYWwiKSksdGhpcy5jcS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiZ2xvYmFsIik7CiJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sQXI6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMudWErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5EYSYmdGhpcy5EYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRGEmJnRoaXMuRGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9CndpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuemM9ITEpO3RoaXMuemMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy56Yz90aGlzLnpjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlk9dGhpcy5haD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5HZikpO3RoaXMuTmIoKTtlLkFjKGsuRHMpOyhiPWUuQ2ModGhpcy5xZCgpKSl8fChiPWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGNxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPQp0aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZmN8fHRoaXMuSmF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy51YX1lbHNlIGE9dGhpcy51YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7CnRoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLlFnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQmEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5mYyYmdGhpcy5KYSYmdGhpcy5CYS5sZW5ndGg/dGhpcy5GYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX0sRmM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5CZCgpKSxkPXRoaXMud2EodGhpcy5mYyk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5mYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5jdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuT2w/dGhpcy5oYSgibm9TVk1Db25maWciKToodGhpcy5PbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuRmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGN1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuRGM9ITA7dGhpcy5GYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuTWIoYi5zdHJpY3QpO3RoaXMud2Y9dGhpcy5NYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy51Zz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5oYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmpjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLndjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMueGI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMudmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmplPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmtoPWIuanNwb3B1cHN8fCExO3RoaXMuSmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMubGM9Yi52cGFpZHx8ITE7dGhpcy5EYS52cGFpZD10aGlzLmxjO3RoaXMuTmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5aYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMubGk9Yi52bWFwc3x8IiI7dGhpcy5ZYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUWE9CmIuYml0cmF0ZXx8MUUzO3RoaXMuUWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuZ2M9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5XcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmdjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuRGM9ITAsdGhpcy5GYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5KdSgpJiYodGhpcy5oY3x8dGhpcy5qY3x8dGhpcy5pY3x8dGhpcy5nY3x8dGhpcy5LZCk/dGhpcy5hZj8odGhpcy5VYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLm5lKCksdGhpcy5OYigpKTp0aGlzLm11KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubnUoKSl9fSwKbXU6ZnVuY3Rpb24oKXt0aGlzLmx1KCk7dGhpcy5vdSgpfSxvdTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmFhKDEwKSxnPWUuYWEoMTApLEg9ZS5hYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS55YihhKGMpKSsKYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5oZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5EYSYmdGhpcy5EYS5wbGF5ZXImJnRoaXMuRGEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7cmV0dXJufXRoaXMuaGEoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG51OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpfSxNYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLlVhPSEwLApkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxsdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmpoKCkpdGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5pYz10aGlzLktkKSYmdGhpcy5pYy5sZW5ndGgpe3ZhciBkPXRoaXMuaWMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5wZigpfSxydTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuS2EobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuc3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmpjJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LHN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0scGY6ZnVuY3Rpb24oKXt0aGlzLmdjPyh0aGlzLnNmKyssdGhpcy5LYShuZXcgeih0aGlzLmdjKSx0aGlzLmt1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuVGgoKX0scWY6ZnVuY3Rpb24oYSl7dGhpcy5NYyh0aGlzLkhmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIisKYSl9LGt1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKTt0aGlzLm5lKCl9LGpoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sTmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVmEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLAphKyIiK2IsITApOyIxIj09PWImJihlLkFhKCJ0LW9ubGluZS5kZSIpfHxlLkFhKCJnaWdhLmRlIil8fGUuQWEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuamgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSWYpKTt0aGlzLlBkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUGQmJnRoaXMuUGQoKX0sbG86ZnVuY3Rpb24oKXtpZih0aGlzLndmJiZ0aGlzLmZxKCkpe3ZhciBhPXRoaXMuT3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LCRoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMucGR8fAoodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlJnJiYhdGhpcy5TZyYmKHRoaXMuU2c9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlJnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLm9pPSEwKTtjJiZlLldxKCkmJihhLkNnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxqbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMucmQoKXx8KGE9dGhpcy53YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxqdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0sa286ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdi5iaW5kKHRoaXMpLHRoaXMuYnYuYmluZCh0aGlzKSl9LGN2OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMucHAoKX0sYnY6ZnVuY3Rpb24oKXt9LHBwOmZ1bmN0aW9uKCl7ZS5BYyhrLm9wKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5KYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSxKdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHliOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmJrfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaT10aGlzLmFbNV07dGhpcy5rcT10aGlzLmFbM107dGhpcy5DaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbOV07dGhpcy53cT10aGlzLmFbMV07dGhpcy56az10aGlzLmFbM107dGhpcy5BbT10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy5Jdj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5ycj1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTGk6dGhpcy5qcShhKX0sCmpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ2k6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy55ayhhKX0seWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnprOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BbTp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudWo6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMucnJ8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmcuUD90aGlzLmJiPWEuZy5QKCk6dGhpcy5iYj0iIjthLmcuWmcmJmEuZy5aZyh7cGF1c2U6dGhpcy54ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuWHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZzt0aGlzLlZiPXRoaXMuWGM9ITE7dGhpcy5Obj0xRTM7dGhpcy5yYT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlduPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlZjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmCih0aGlzLlZjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5nKSYmdGhpcy5iLmcudSYmKGE9dGhpcy5iLmcudSgpKSx0aGlzLlZjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudWg9dGhpcy5HZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy53bz1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5lZD10aGlzLm9mPXRoaXMuc2I9dGhpcy5tYz0KdGhpcy53aD10aGlzLmtkPXRoaXMuTXU9dGhpcy52Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLnlzPTIwMDt0aGlzLkRmPXRoaXMuRWY9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy53ZD17fX1jLldqPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLiRiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5JZCgiY2FsbCIsdGhpcy5aYSgpKTtlLncoay5UbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxMZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnZiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihnPSEwKTtpZih0aGlzLkwuWSl0aGlzLm1mKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5MLmxvKCksYz1sLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm5oLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5sYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmcuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZy5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5MZShhLGIsZCl9LDUwKX19LFdlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5RZD10aGlzLk9iPXRoaXMua2Q9ITE7dGhpcy5jPWE7dGhpcy5HdCh0aGlzLmMpO3RoaXMud2Q9bmV3IFFhKHRoaXMuYy5ndix0aGlzLnZpZGVvLHt9KTt0aGlzLk5nKGEpO3RoaXMucmM9dGhpcy5FZyhhKTt0aGlzLnFvKCl9LE5nOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkhkPXRoaXMuWnAoYSkpLHRoaXMuTmcoYS5wYXJlbnQpKX0sRWc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZgpifHwoYz10aGlzLkVnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnAoYSkpKTtyZXR1cm4gY30sSnA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuWGQuY29kZT9lLncoay5Cdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLk1lKCksYj09Ri5MZi5jb2RlJiZlLncoay5Tcix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5ucCx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuSWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkpmLmNvZGU6ZS53KGsuZHYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5NZi5jb2RlOmUudyhrLkV2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LllkLmNvZGU6ZS53KGsuSnYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpOwpicmVhaztjYXNlIHcuVWQuY29kZTplLncoay5Ucix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLncoay4kdSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRmYuY29kZTplLncoay5hdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuS2UoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LApHdDpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuWXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5ibiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5YbShiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuSWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuJG0oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuc28oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkV0KCkpOnRoaXMuYy5vcmlnaW4udmcody5VZCl9LEV0OmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnNiPXRoaXMubWM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5uZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMuc2I9ITApO2Uub2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnRhJiZlLmFuKHRoaXMuYy5vcmlnaW4udGEpO2UuZ2IoInNldFVwVnBhaWQiKTt0aGlzLklkKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnhoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuYnEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZWcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnJjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMucHYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5xdigpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9CiEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy51digpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMueXYoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMud3YoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMueHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy56digpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy52digpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5taSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsubWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLlljJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnR2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5jZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5FZiYmCih0aGlzLkRmPSExLHRoaXMuZWMoKSksdGhpcy5zdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMuc2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLnZmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5iZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sc3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubWM9ITF9LHV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHF2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZ2IoImltcHJlc3Npb24iKTt0aGlzLlBoKCk7ZS53KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZ2IoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx3djpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO2UuZ2IoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LHh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmdiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5nYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx2djpmdW5jdGlvbigpe3RoaXMueWYoKTtlLmdiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LG1pOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZ2IoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxwdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmdiKCJlcnIiLGIpO2UudyhrLkF2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5taSghMCl9LFhtOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5yZCgpKXt2YXIgZD1iLndhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubHYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5ObikpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5YYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlhjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC51Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuaHYoKTt0aGlzLmhpKCk7dGhpcy5mZygpO3RoaXMuYi54aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlNmKCl9LFNmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5TZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLlJtLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSxVbTpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjwKYS5sZW5ndGg7ZisrKWM9ZS5JZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLld0KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5SZCYmdGhpcy5VbSh0aGlzLmMuUmQpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5RZHx8KGUudyhrLlZyLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnVifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLlZiPXRoaXMuWGM9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5vZj0KITA7dGhpcy5iLkJlKCk7dGhpcy5hYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudWImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucmgoKTp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxsdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5qbygpO3RoaXMuYy5vcmlnaW4udmcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5NdSl0aGlzLlJhKCk7CmVsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZy5MYSYmIXRoaXMub2YmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmNkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlJ1KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YiwKcGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnViPyh0aGlzLlZiPXRoaXMuWGM9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6CnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy53aHx8KHRoaXMud2g9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFJ1OmZ1bmN0aW9uKGEpe2UudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZiKSx0aGlzLnZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5QaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlVmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLlJmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYKKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmNpPWEpfSxJZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sUGg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHwKdGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMud2QmJnRoaXMud2QudHJhY2smJnRoaXMud2QudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuJHAodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkhkLmltcHJlc3Npb25zJiZlLlVxKGcudXJsLHRoaXMuSGQuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsCmcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5TbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLkZvKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuRWYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5XbShjKSxmfHwoZj10aGlzLnRnKSxlfHwoZT10aGlzLnRnKSx0aGlzLlltKGEpLHRoaXMuTC5LYShiLApmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LHFvOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sWnQ6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sJHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxGbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuanYuYmluZCh0aGlzKSl9LApqdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLncoay5tZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWWMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOgooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuWmMmJihiPXRoaXMuTC5aYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5BYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LApBYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLndvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0KIkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksCmcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk91LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTnUuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkJiKCk7dGhpcy5BYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksCmwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSksCnRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5CYigpO3RoaXMuQWIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy54YSYmKHRoaXMueGEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmJnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsubmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlFlKCkpO3RoaXMuQmIoKX19LEJiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx4ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLlRjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LE91OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFh1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5RYyl8fHRoaXMudWg/KHRoaXMuZWQ9ITAsdGhpcy52YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52YiksdGhpcy52Yj0hMSksdGhpcy5vZygpKToodGhpcy51aD10aGlzLkVmPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZWcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuWnQoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnlzKToodGhpcy5vZj0hMCx0aGlzLmIuQmUoKSx0aGlzLmIuaXQoKSx0aGlzLmFjPSExLGUudyhrLnZvLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy54ZSgpLkdoKCkpfSwKeGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sZmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnhkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuV24rIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSmcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkpnKCkpO3JldHVybiBhfSx0ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuV2p8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLnl1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMubG49YjtiLnByb3RvdHlwZT17RHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkVxOnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55dTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMubG58fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsCm5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5EcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkVhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMucWM9dGhpcy5zYz0hMTt0aGlzLnRhPSIiO3RoaXMuQmY9ITE7dGhpcy5VZz0iIjtkJiZkLmVtcHR5P3RoaXMuRnIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5lbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5oZCgpLGI7Yj1lLndhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTsKYj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC55YShsLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucWcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuSmQoYSkpKyImdHlwZT1qcyIsYj1sLnlhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwueWEobC5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS4kYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuJGJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLiRifHx0aGlzLlpxKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLmp1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LFpxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sRXI6ZnVuY3Rpb24oYSl7dGhpcy5TcyhhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5VZz1hLnJlc3BvbnNlVVJMO3RoaXMuWC5sZW5ndGg/dGhpcy5IYygpOnRoaXMucWEodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLkJmP0YuWGQ6CkYuS2Z9KSl9LEZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5YLmxlbmd0aD90aGlzLkhjKCk6dGhpcy5xYSh0aGlzLlNhKHcuT2Mse2Vycm9yOnRoaXMuQmY/Ri5YZDpGLktmfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5TYSh3LkpmLHtkZXB0aDphfSkpfSxIYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLmFyKCk/dGhpcy50dSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLk9nKCksaCx7QWRTeXN0ZW06dGhpcy5JcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnFhKHRoaXMuU2Eody5NZikpOihhPTAsdGhpcy5ZdSgpJiZ0aGlzLldlKHRoaXMueG8oKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMuc2M/Cih0aGlzLnNjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkhjKCkpOnRoaXMucGFyZW50LlJlKCl9LHJoOmZ1bmN0aW9uKCl7dGhpcy5xYz8odGhpcy5xYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5IYygpKTp0aGlzLnBhcmVudC5yaCgpfSxZdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1KCk/dGhpcy5wdSgpPyEwOigtMSE9dGhpcy5CYygpP3RoaXMucWEodGhpcy5TYSh3LlRkKSk6dGhpcy5xYSh0aGlzLlNhKHcuRmYpKSwhMSk6KHRoaXMucWEodGhpcy5TYSh3Lk9jLEYuTGYpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVWcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5OZSgpKTthLnViPWEudWI/YS51Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5CZzt0aGlzLnBhcmVudC5XZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5CYygpO2EuTz10aGlzLkxnKCk7YS5VYj10aGlzLktwKCk7YS5ndj1bXTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkhwKCk7YS5sZj10aGlzLllwKGEuZHVyYXRpb24pO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYil7dGhpcy50YXx8KHRoaXMudGE9IiIpO2IuJGE9Yi4kYT9iLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHAoKSk6Yi5QYS5jb25jYXQodGhpcy5UcCgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LldiJiZ0aGlzLnBhcmVudC5XYihiKSxhPTAsdGhpcy5IYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGIpLGE9MCl9LFdiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LldiKGEpfSx2ZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx0dTpmdW5jdGlvbigpe3JldHVybiBhPGh9LHF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5MZygpLmxlbmd0aH0scHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkJjKCl9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LFNzOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxhcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2coKS5sZW5ndGh9LE9nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sSXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmJoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5iaChhLnBhcmVudE5vZGUpOiExfSxUcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxMcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCkxnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHp3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxIcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLm5kKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxCYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFlwOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVnQoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuZW18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR209dGhpcy5hWzFdO3RoaXMuVnU9dGhpcy5hWzddO3RoaXMubXQ9dGhpcy5hWzhdO3RoaXMuUHE9dGhpcy5hWzZdO3RoaXMuQ249dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMV19Yy5Sbj1iO2IucHJvdG90eXBlPXtGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMubHQoYSl9LGx0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUHE6CnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dbjp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlJufHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5GbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQT10aGlzLnBjPXRoaXMudWI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5zbD1iO2IucHJvdG90eXBlPXtzbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxScDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRWEpe3ZhciBhPXRoaXMub3JpZ2luLkVhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxKZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5ScCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sYnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLnNsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbNl07dGhpcy55aT10aGlzLmFbOF07dGhpcy5jcj0KdGhpcy5hWzRdO3RoaXMub209dGhpcy5hWzddO3RoaXMubWo9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNV19Yy5Fbz1iO2IucHJvdG90eXBlPXtIbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW06dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Fb3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuSG0oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsCmNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE9hOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LE1mOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSwKSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxadjp7dHlwZToiZXJyb3IiLApjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtLZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxMZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSwkdjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbN107dGhpcy5icD10aGlzLmFbMl07dGhpcy5ucz10aGlzLmFbN107dGhpcy5Taj10aGlzLmFbNF07dGhpcy5BaT10aGlzLmFbNl07dGhpcy55cT10aGlzLmFbMl07dGhpcy5LdD10aGlzLmFbMV07dGhpcy5pcj10aGlzLmFbNV07dGhpcy5JdD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLkVtPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52czp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYnA6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tajp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWk6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlxOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLkt0OnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pcjp0aGlzLkh0KGEpfSxIdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkVtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy51cyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuQ2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DcT10aGlzLmFbNF07CnRoaXMudXE9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzNdfWMuSXM9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNxOnRoaXMudHEoYSl9LHRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51cTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuSXN8fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkJxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLk9kPVtdO3RoaXMuRWg9W107dGhpcy5TZT1bXTt0aGlzLmt2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7CnRoaXMuTSgpfWMuTWs9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtlLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGc9ZS5jb250ZW50V2luZG93O2cuVXc9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuZnQuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuWHMuYmluZCh0aGlzKX07dmFyIGs9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmsub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtnLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7dGhpcy5PZC5wdXNoKHtzcmM6YyxmcmFtZTplLENzOmYsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlNlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuU2VbYl07Yy50eXBlPT09YSYmYy4kbih0aGlzLk1wKGEpKX19LE1wOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e2N4OiEwLGJ4OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e1F3OiJ2aWRlbyIsZXg6ImpzQ3VzdG9tIixmeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxneDoxLEF3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sYXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLk9kLmxlbmd0aDtiKyspaWYodGhpcy5PZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLk9kW2JdLkNzO3JldHVybiIifSxmdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuYXEoYiksdmVuZG9yOmJ9KTsKdGhpcy5YdCgpfSxYczpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMua3YubWFwKGZ1bmN0aW9uKGEpe3RoaXMuY2coYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5jZyhhLGIpfSxjZzpmdW5jdGlvbihhLGIpe3RoaXMuU2UucHVzaCh7dHlwZTphLCRuOmIsJHc6ITF9KX0sWHQ6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLlhxfHwoYS5Udyh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuZHgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLlhxPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO3ZhciBRYT1jLk1rfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kaz10aGlzLmFbMTBdO3RoaXMuTmw9dGhpcy5hWzNdO3RoaXMuTHY9CnRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLnBqPXRoaXMuYVs5XTt0aGlzLmtyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzddfWMuRmk9YjtiLnByb3RvdHlwZT17Wms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRrOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ObDp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTHY6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhrOnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLkZpfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuWmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5nPWE7dGhpcy5qYj1hLkdnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuZGc9ITE7dGhpcy5UYj1bXX1jLm5qPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYsCnk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5pcShhKSxnPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtnPXt4OmIseTpjfTtmJiYoZy5wb3NpdGlvbj1mKTtyZXR1cm4gZ30sYnU6ZnVuY3Rpb24oKXt0aGlzLmRnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0seGg6ZnVuY3Rpb24oKXt0aGlzLmcucGF1c2UoKTtlLncoay5jZCx0aGlzLmcudSgpKX0saXQ6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5nLnBsYXkoKSxlLncoay5kZCx0aGlzLmcudSgpKSl9LGtmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuamIpO3RoaXMuZy5KYyYmdGhpcy5nLkpjKCk/dGhpcy5nLkdnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sCmlxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx4cDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueHAodGhpcy5qYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5nLkpjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5RaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxiZzpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMubmp8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLll2PXRoaXMuYVs2XTt0aGlzLmdwPXRoaXMuYVs2XTt0aGlzLk10PXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLndqPXRoaXMuYVs5XTt0aGlzLndpPXRoaXMuYVs5XTt0aGlzLlNpPXRoaXMuYVs3XTt0aGlzLnpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLkJzPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnY6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLll2OnRoaXMuZnAoYSl9LGZwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncDp0aGlzLkx0KGEpfSxMdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXQ6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJzOgp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLndpOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Cc3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuTXYoNCk7KGZ1bmN0aW9uKGMpe2Muamw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwKKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5EZChiKTt0aGlzLnJnKCl9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxyZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiYKYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5qbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuaWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlZmPXRoaXMuWGY9CnRoaXMuWWc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMudXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWWcmJnRoaXMubGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYWQoKTt0aGlzLllnPSEwO3RoaXMubGcoKX0uYmluZCh0aGlzKSk7CnRoaXMuaGcoKX0sbGc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5hZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5hZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVmYmJiF0aGlzLlhmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0sYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE1nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGhnOmZ1bmN0aW9uKCl7aWYodGhpcy5hZCgpKXt2YXIgYj0KdGhpcy5NZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlhmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVmY9Yi54d310aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLk93KCk6ITF9LEJjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5CYygpOi0xfSxVcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx1cDpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMucygiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCl9LmJpbmQodGhpcyksMTAwKX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlVwKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuaWx8fGRiOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWXE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ud2wuTG0uSm0/d2luZG93Lk9PLndsLkxtLkptLnZ3KGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZcSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMua2x8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jcj10aGlzLmFbNV07dGhpcy5xaz10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbMl07dGhpcy5qPQp0aGlzLmFbOF19Yy5Jaz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXI6dGhpcy5wayhhKX0scGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFrOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuSWt8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkhyKDQpOyhmdW5jdGlvbihjKXtjLmFqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5QZygpfSxQZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7CmJ8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlYoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LApOYTpmdW5jdGlvbigpe3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlcmJigwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLmFqfHxoYjsoZnVuY3Rpb24oYyl7Yy4kaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxpZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnYoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnBhKCk6dGhpcy5tKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5pZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmlnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LERoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwKKGIuRGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudnB8fCh0aGlzLnZwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5EaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuRGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixUPW5ldyBqYihyKTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRW49dGhpcy5hWzVdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuR2s9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsyXTt0aGlzLm1rPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLnlsPXRoaXMuYVs0XTt0aGlzLmV1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuT289YjtiLnByb3RvdHlwZT17RG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVuOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kajp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxqOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHI6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlsOnRoaXMuZHUoYSl9LApkdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmV1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Pb3x8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuRG4oNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSmM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLlVsfHxVOyhmdW5jdGlvbihjKXtjLlRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuVWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnYuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTsKeS5VYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmFzKGEpfS5iaW5kKHRoaXMpKTt5LlVjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuVWMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LmVxKCl9LGFzOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudigpO3RoaXMucGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwKMTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLnYoKTt0aGlzLnBhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5UbHx8VjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy52ZCYmKGI9ZS5HbyhiLHRoaXMudmQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7CnZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmYoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy52ZHx8KHRoaXMudmQ9W10pLHRoaXMudmQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFVjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LHV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuR2N8fAoodGhpcy5HYz1bXSksdGhpcy5HYy5wdXNoKGIpLHRoaXMuaHQoKSYmKHRoaXMuY2YoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sZXE6ZnVuY3Rpb24oKXtpZih0aGlzLkdjKWZvcih2YXIgYj0wO2I8dGhpcy5HYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkdjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPQpiLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkudXUoYil9fSl9KShjKTt2YXIgbGI9Yy5WbHx8bGIseT1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbMl07dGhpcy5rdD10aGlzLmFbNF07dGhpcy5tcj10aGlzLmFbNl07dGhpcy52az10aGlzLmFbMV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5JdT10aGlzLmFbOF07dGhpcy5DdT10aGlzLmFbOF07dGhpcy5Waz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkZxPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ncjp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1yOnRoaXMudWsoYSl9LAp1azpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudms6dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkF1OnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5JdTp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3U6dGhpcy5VayhhKX0sVWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5GcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnYoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpOwphLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuWWl8fG9iOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgbmIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgb2IoZSx0aGlzLkkpKS5mKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9CmIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuWml8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Uaz10aGlzLmFbNl07dGhpcy5Bcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnVyPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ubjp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGo6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vazoKdGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5pOnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Uazp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLnVyfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5tbig0KTsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuV3ModGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sV3M6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWmc6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5Ya3x8c2I7KGZ1bmN0aW9uKGMpe2MuV2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5pPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm5hKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLldrfHx0YjsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5JKSkuZigpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpO3ZhciB1Yj1jLllrfHx1YixXPW5ldyB1YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucnA9dGhpcy5hWzRdO3RoaXMua3A9dGhpcy5hWzNdO3RoaXMuRHA9dGhpcy5hWzddO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuaWo9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuaWp8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnFwKDQpOyhmdW5jdGlvbihjKXtjLmxtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLmxtfHx3YjsoZnVuY3Rpb24oYyl7Yy5rbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sVXM6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE/dGhpcy5Vcyh0aGlzLnphKToodGhpcy56YT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuemEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmCnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5lYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5lYlthXSYmMzAzIT10aGlzLmViW2FdJiY0MDMhPXRoaXMuZWJbYV0mJihiPSExKTtpZihiKXRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLmttfHx4YjsoZnVuY3Rpb24oYyl7Yy5tbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5JKSkuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLm1tfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnE9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuaGs9YjtiLnByb3RvdHlwZT17SXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuaGt8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLklxKDQpOyhmdW5jdGlvbihjKXtjLklsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVihiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuS3MoKX0uYmluZCh0aGlzKSw1MDApfSxLczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFl0OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Lcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Lcj8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWXQoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLkhsfHxDYjsoZnVuY3Rpb24oYyl7Yy5KbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuSmx8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdT10aGlzLmFbMV07dGhpcy5mdj10aGlzLmFbNV07CnRoaXMuZXM9dGhpcy5hWzZdO3RoaXMuTHE9dGhpcy5hWzJdO3RoaXMucW49dGhpcy5hWzEwXTt0aGlzLlFvPXRoaXMuYVs0XTt0aGlzLmxzPXRoaXMuYVs5XTt0aGlzLndtPXRoaXMuYVszXTt0aGlzLmpzPXRoaXMuYVsxMF07dGhpcy5XaT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs2XX1jLmRqPWI7Yi5wcm90b3R5cGU9e0t1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmVzOnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5McTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucW46dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Rbzp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy52bShhKX0sCnZtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53bTp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpzOnRoaXMuVmkoYSl9LFZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuZGp8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLkt1KDQpOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7CnZhciBHYj1jLkRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMudnIoKTp0aGlzLmtnKCk7Yi5hdXRvcGxheSYmCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHRvOmZ1bmN0aW9uKCl7dGhpcy5UZigpfHx0aGlzLm0oITApfSx2cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5vYSYmYi5YJiZiLnV3JiZiLnd3JiYodGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2coKX0uYmluZCh0aGlzKSwxMDApfSxtZDpmdW5jdGlvbigpe2lmKCF0aGlzLnZoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy52aD1iW2NdKTtyZXR1cm4gdGhpcy52aH0sUHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5DbHx8SGI7KGZ1bmN0aW9uKGMpe2MuRWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmYoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLkVsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzFdO3RoaXMuSGk9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs5XTt0aGlzLmVyPXRoaXMuYVsxXTt0aGlzLm1xPXRoaXMuYVs1XTt0aGlzLml1PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMud3A9CmI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5obDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5IaTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3I6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMubHEoYSl9LGxxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tcTp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLndwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5nbCg0KTsKKGZ1bmN0aW9uKGMpe2MuS2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5WKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxOdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxKYzpmdW5jdGlvbigpe3JldHVybiEwfSxJYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuS2t8fFg7KGZ1bmN0aW9uKGMpe2MuSms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLlZ3KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmt8fFk7KGZ1bmN0aW9uKGMpe2MuTGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5mKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5tYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBHLExiPWMuTGt8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuZ3U9dGhpcy5hWzJdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzNdO3RoaXMuV3Y9dGhpcy5hWzEwXTt0aGlzLmZqPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLld1PWI7Yi5wcm90b3R5cGU9e2ZzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nczp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3U6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbzp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmo6dGhpcy5WdihhKX0sVnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLld2OnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuV3V8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLmZzKDQpOyhmdW5jdGlvbihjKXtjLlVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksCmEmJmM/KHRoaXMuVihjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LExhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxTdzpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlVqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Uaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlRqfHxQYjsoZnVuY3Rpb24oYyl7Yy5Waj0KcC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmd2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMoKTtpZihiJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5tYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5mKCkpfX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlZqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Y9dGhpcy5hWzJdO3RoaXMuZm49dGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzhdO3RoaXMueWo9dGhpcy5hWzNdOwp0aGlzLlJzPXRoaXMuYVs4XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs1XX1jLmVrPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hdjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZm46dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLktuOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJzOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmVrfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuQ209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVihhKX1lbHNlIHRoaXMuY2EoKX0sTWQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSwKZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxWczpmdW5jdGlvbigpe3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuU2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlNkfHwodGhpcy5TZD0hMCx0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKTGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLkNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5CbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxaczpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSl9LCRjOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMucygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxQZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPQowO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuJGMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlBmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuWnMod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5QZigpO3RoaXMuWXMoKX0sWXM6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuVHM/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5Ucz0KITB9fSl9KShjKTt2YXIgVWI9Yy5CbXx8VWI7KGZ1bmN0aW9uKGMpe2MuRG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5WcygpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMuRG18fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJHI9dGhpcy5hWzldO3RoaXMuUmw9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOV19Yy5zcT1iO2IucHJvdG90eXBlPXtacjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLiRyOnRoaXMuUWwoYSl9LFFsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuc3F8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLlpyKDQpOyhmdW5jdGlvbihjKXtjLmFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLApiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Rcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnloJiYodGhpcy55aD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMuYW18fE87KGZ1bmN0aW9uKGMpe2MuJGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0semE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5EdCgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuJGx8fFA7KGZ1bmN0aW9uKGMpe2MuYm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLk5rPWI7Yi5wcm90b3R5cGU9e09pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuTmt8fCRiLFhjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLk9pKDQpOyhmdW5jdGlvbihjKXtjLkRrPQp0LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVihhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuQ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmc9MDt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPQp0aGlzLldjPSExO3RoaXMuQ2g9ZS5IYigxMCk7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlZnKys7aWYoMTA8dGhpcy5WZyl0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5tKCEwKTp0aGlzLm0oKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVoLmJpbmQodGhpcyksMTAwKSwhMX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudmEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Da3x8YWE7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgYWM9Yy5Fa3x8YWMsYmM9bmV3IGFjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5CcD10aGlzLmFbMTBdO3RoaXMudHI9dGhpcy5hWzldO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLmJvPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5Qaz10aGlzLmFbN107dGhpcy5Icz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5zaj1iO2IucHJvdG90eXBlPXtBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50cjp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSmk6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xdDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUGs6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2p8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFwKDQpOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7CnZhciBkYz1jLlBqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Paj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qZygpfSxqZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuT2p8fGVjOyhmdW5jdGlvbihjKXtjLlFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsKKG5ldyBlYyhiLHRoaXMuSSkpLmYoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuUWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbj10aGlzLmFbNl07dGhpcy5naz10aGlzLmFbOV07dGhpcy5CbD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbMV07dGhpcy5xcj10aGlzLmFbNV07dGhpcy5Gcz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLlNsPWI7Yi5wcm90b3R5cGU9e2NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kbjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ2s6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJsOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Cbzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLnFyOnRoaXMuRXMoYSl9LEVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuU2x8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmNuKDQpOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5yaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5tZSgpO3RoaXMuZ2coKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSwKZ2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9LG1lOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fApiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMucGl8fGpjOyhmdW5jdGlvbihjKXtjLnNpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMuc2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ycT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmZsPWI7Yi5wcm90b3R5cGU9e3FxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuZmx8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnFxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmdoPXRoaXMuaWg9dGhpcy5oaD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjPwpudWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj8KbnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLnVsPWI7Yi5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuVnAoYSk6W10sYjt0aGlzLmloPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmhoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5naClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYKYSBpbnN0YW5jZW9mIHA/ITA6ITF9LFZwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LCR0OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiB0JiYhdGhpcy5oaClmb3IodGhpcy5naD0hMCxhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnlkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMudWx8fG5jLE09bmV3IG5jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNvPXRoaXMuYVs3XTt0aGlzLlF1PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVs3XTt0aGlzLmhuPQp0aGlzLmFbNl07dGhpcy5TdD10aGlzLmFbMV07dGhpcy5Wbj10aGlzLmFbOV07dGhpcy53dT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLnJvPWI7Yi5wcm90b3R5cGU9e1JvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tbzp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUXU6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5objp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZuOnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5yb3x8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlJvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkFjKGsuWnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkFjKGsuVXIpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsCiIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmphKCk7SS4kZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuamEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLiRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5qYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2UuQWcod2luZG93LEkuTnEoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTsKZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbN107dGhpcy5nbT10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbNV07dGhpcy5Qdj10aGlzLmFbNF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzddO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy56bD1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Sazp0aGlzLk92KGEpfSxPdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHY6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy54cjp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5vOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2w6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy56bHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnpoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy50ZD0wOwp0aGlzLmJiPSIiO3RoaXMuemQ9W107dGhpcy5BZD0wO3RoaXMuQmg9ITE7dGhpcy5aZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXt0aGlzLnpoPWF9LGhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdXQ6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx0dDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxLYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5RcSgpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIudWEsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuS2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLnpjKTtlbHNlIGlmKHRoaXMuZ3EoKSl0aGlzLm90KGZ1bmN0aW9uKCl7dGhpcy5LYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuY2QsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLApnKTtsLnN0KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5KcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkplJiYoYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnRkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudGQuZ2V0VGltZSgpLHRoaXMudGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnRkPWE7cmV0dXJuITF9LFV0OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMud2coYSkpP3RoaXMuS2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5kZCx0aGlzLnBsYXllci51KCkpKX0sVHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuemgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLnp0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLndnKGMpKT90aGlzLktjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5kZCx0aGlzLnBsYXllci51KCkpKX19LHdnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxidDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkZ0KHRoaXMuVHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5vaCl7dGhpcy5vaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5LYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5kZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxhdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnl0KHRoaXMuRmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuT2UoKX0sZjpmdW5jdGlvbigpe3RoaXMuVXQoKTt0aGlzLnBsYXllci5PZSYmdGhpcy5hdCgpO3RoaXMuYnQoKX0sY3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy56ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuVXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkFkPXRoaXMuemQubGVuZ3RofSxncTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5BZCYmKGE9ITApO3JldHVybiBhfSwKb3Q6ZnVuY3Rpb24oYSl7dGhpcy5CaD1hO2ZvcihhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXVsiZnVuY3Rpb24iXSh0aGlzLk9zLmJpbmQodGhpcykpfSxPczpmdW5jdGlvbihhKXt0aGlzLkFkLS07YSYmdGhpcy5aZS5wdXNoKGEpOzA+PXRoaXMuQWQmJnRoaXMuQmgoKX0sSnI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWmUubGVuZ3RoO2MrKyliPXRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUXQ9dGhpcy5hWzZdO3RoaXMucW09dGhpcy5hWzZdO3RoaXMuQXE9dGhpcy5hWzFdO3RoaXMuZXA9dGhpcy5hWzddO3RoaXMuSm89dGhpcy5hWzRdO3RoaXMuT3Q9dGhpcy5hWzVdO3RoaXMuYmw9CnRoaXMuYVs4XTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuUW09YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlF0OnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xbTp0aGlzLnpxKGEpfSx6cTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXE6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kbzp0aGlzLk50KGEpfSxOdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT3Q6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJsOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUW18fHFjLGVkPW5ldyBxYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5QdCg0KX0pLmNhbGwoc2hvaFZvb25waXVOZWFnaSxzaG9oVm9vbnBpdU5lYWdpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.73.195 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:14 GMT
Last-Modified
Sat, 28 Sep 2019 16:44:03 GMT
Server
AmazonS3
x-amz-request-id
56EB30FC45979617
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
RxdGLWbVQtZQReSIgMMKhPbI8s4EXshjWzftJoz2Pc3HKlYjYAluzrhQSTGMxAX+uUeT28/KKXs=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 585E
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=8778716627
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHNob2hWb29ucGl1TmVhZ2k9c2hvaFZvb25waXVOZWFnaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuVWV8fCh5LlVlPTApO3kuVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5abillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5jZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS51dChsKTthLnR0KG0pO2EuY3QoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGE9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5DdCh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzFdO3RoaXMucHM9dGhpcy5hWzRdO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuSHE9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy56bz1iO2IucHJvdG90eXBlPXtZbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmw6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVvOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSHE6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy56b3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWm49ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5vZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLk5zLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5UZz17fTt0aGlzLmVmPSExfWMuWWo9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrCnRoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5UZ1thXSYmKHRoaXMuVGdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5hdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGFuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmCihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxsYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sTnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuTXMoYS5kYXRhKX0sTXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxoZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSwKcWc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMubGgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LElnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFptOmZ1bmN0aW9uKGEsCmIpe2lmKGImJiEoMD50aGlzLndhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuRXAoYSkpcmV0dXJuOyhiPXRoaXMucWcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxFcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx5ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZ2I6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfY2FjaGVfIithLGIsITApfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seWU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxIZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUWg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sCkhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixmLGQ7Zm9yKGY9NzswPD1mO2YtLSlkPWE+Pj40KmYmMTUsaCs9ZC50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHgsdSxyLHA7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgdD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx0LnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IodC5wdXNoKGYpOzE0IT10Lmxlbmd0aCUxNjspdC5wdXNoKDApO3QucHVzaChuPj4+MjkpO3QucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx0Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXRbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eD1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspcD1kKHEsNSkrKG4meHx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9MjA7Mzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTQwOzU5Pj1mO2YrKylwPWQocSw1KSsobiZ4fG4mdXx4JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eCwKeD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NjA7Nzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreCY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxoZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cSkmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxIazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LFBuOmZ1bmN0aW9uKCl7cmV0dXJuIGEuUWkoKXx8YS5jaigpfHxhLm5xKCl8fGEubGwoKXx8YS5ybSgpfHxhLkhrKCl8fGEuUGwoKX19O3JldHVybiBudWxsIT1hLlBuKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sQ2M6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sQWE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sWHA6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEdvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LFZ0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LERnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5kaShiKSsiOiIrdGhpcy5kaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGdmOmZ1bmN0aW9uKGEpe3RoaXMuJGI9YX0sQWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy4kYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKQWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkFnKGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQWMoQil9LFBzOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuWHAoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxXdDpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlBzKGEpO2lmKGIpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5CZCgpO2wueWEoYSwhMCk7YT1sLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuS2EoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLk5jfHwodGhpcy5OYz17fSk7dGhpcy5OY1tmXXx8KHRoaXMuTmNbZl09MCk7dGhpcy5OY1tmXSsrOzEwPHRoaXMuTmNbZl18fChmPQpsLkJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZil7dmFyIGQ9ITE7Zj1mLnJlc3BvbnNlVGV4dDt0cnl7Zj1KU09OLnBhcnNlKGYpLGY9Zi5kYXRhLGZbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGQ9ITApLGZbMV0mJmZbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGQ9ITEpfWNhdGNoKGMpe31kfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZlswXT9mWzBdOiIiKSsoZlsxXT9mWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LApNZTpmdW5jdGlvbigpe2wmJmwuWT9sLmlzRW5hYmxlZCYmbC5rbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxlZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuJHEoYSl8fDA8PQphLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZGYmJndpbmRvdy5zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueWcoYSkpcmV0dXJuIHRoaXMueWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTsKYy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkphLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlptKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIG09ZXx8bDtlPSEwO2smJihlPSExKTtpZihtJiZtLlkpaWYobS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle20ueWEoYSxlKTtlPW0ueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbS5LYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLG0sZyxrKX0uYmluZCh0aGlzKSw1MDApfSxsaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sRHI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMubGgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTGMpZm9yKHZhciBjIGluIHRoaXMuTGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5MY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sbWg6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuSmEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkRyKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkxjPWF9LFV2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxRbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFVxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLllqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlhqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuRHM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLAptZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLlRyPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJ2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5XZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi4kZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlJtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlVmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuZHY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlNyPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9wPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Fdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIiwKbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi52bz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5jZD17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWWY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLlRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5UYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9OwpiLmNlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5TbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iua2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnVkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5uZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuQXY9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9OwpiLiR1PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Vcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbNl07dGhpcy4kbz10aGlzLmFbOF07CnRoaXMubXA9dGhpcy5hWzFdO3RoaXMueW09dGhpcy5hWzNdO3RoaXMuaXA9dGhpcy5hWzhdO3RoaXMuR249dGhpcy5hWzEwXTt0aGlzLnRzPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMuUHI9YjtiLnByb3RvdHlwZT17bnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9yOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubXA6dGhpcy54bShhKX0seG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnltOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pcDp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR246dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5Qcnx8CmphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLm5yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuWmo9YjtiLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxTcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sbGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmxkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMubGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxqYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsKIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamEoKSsiMiJ9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5TcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlpqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkR2PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuWXI9YjtiLnByb3RvdHlwZT17Q3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkR2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuWXJ8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkN2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5qaj1ifSkoYyk7dmFyIEw9Yy5qanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xbz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnlvPWI7Yi5wcm90b3R5cGU9e1ZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlluOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnlvfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Wbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLnRsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5JYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnZ0KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpOjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGNmOmZ1bmN0aW9uKCl7dGhpcy5JYj0KMH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHZ0OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5paCYmTS4kdChiKX0sSHc6ZnVuY3Rpb24oKXtyZXR1cm4gZS55ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LFZxOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy50bHx8cDsoZnVuY3Rpb24oYyl7Yy52bD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPQp0aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5JYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5DYj0iIjt0aGlzLnNnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxJdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LHl0OmZ1bmN0aW9uKGIpe3RoaXMuUGU9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZX0sT2U6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD0KdGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkljKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEdnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGF4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmhxKCl8fHRoaXMuVm0oKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sVm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sCkVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxKZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkNiPWJ9LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2J9LApHaDpmdW5jdGlvbigpe3RoaXMuQ2I9bnVsbH0sTHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkNiJiYoYj0hMCk7cmV0dXJuIGJ9LFd3OmZ1bmN0aW9uKCl7dGhpcy5zZ3x8KHRoaXMuc2c9ITApfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxDdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy52bHx8dDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLk5mPSIxIjt0aGlzLk9mPSIyIjt0aGlzLkttPSIzIjt0aGlzLlBjPTA7dGhpcy5waD0zMDt0aGlzLlJiPVtdO3RoaXMuaGI9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5hZz10aGlzLmdpPQohMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5oZihiKTt0aGlzLnd0KGEpfSxmOmZ1bmN0aW9uKCl7fSxwYTpmdW5jdGlvbigpe3RoaXMuZ2l8fCh0aGlzLmdpPSEwLGUuTWUoKSl9LFRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sTXE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmphKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5qZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuTXEoKTtpZighdGhpcy5TcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5qZigpO3JldHVybn10aGlzLmpmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy4kaCgpO3RoaXMuYWc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMudmEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmhiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSwkaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJgoodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0samY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9mfSxEdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLkttfSxuYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LFRmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSxzdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5PZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUGN9LGhmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnVpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllvPXRoaXMuYVsxXTt0aGlzLkxsPXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLlhsPXRoaXMuYVs2XTt0aGlzLlJ2PXRoaXMuYVs1XTsKdGhpcy5Bbj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLnpqPWI7Yi5wcm90b3R5cGU9e1hvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Zbzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5YbDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnY6dGhpcy56bihhKX0sem46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy56anx8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuWG8oNCk7CihmdW5jdGlvbihjKXtjLkRqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuRGp8fG9hOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLAphPWIudHc7YT9hLm9hP2Eub2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5Fanx8cGE7KGZ1bmN0aW9uKGMpe2MuRmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuRmp8fHFhOyhuZXcgcWEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Mbz10aGlzLmFbNl07CnRoaXMueW49dGhpcy5hWzldO3RoaXMuY3M9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zcD1iO2IucHJvdG90eXBlPXtLbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTG86dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLnNwfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5Lbyg0KTsoZnVuY3Rpb24oYyl7Yy5zaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMueGcoKTt0aGlzLnpnKCk7dGhpcy51bz0hMX0seGc6ZnVuY3Rpb24oKXt0aGlzLmJjPQohMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0semc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpOwphLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5za3x8c2E7KGZ1bmN0aW9uKGMpe2Mucms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMTt0aGlzLmdldFBsYXllcigpOwp2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLndiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy53Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy53Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMud2I9ITApKTp0aGlzLnYoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMucGgmJgohdGhpcy52YSgpJiYodGhpcy53Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudmEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnVvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiYoYS54ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudigib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMudmEoKSYmKHRoaXMud2I/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlNjLmluZGV4T2YoYSkmJgp0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5TYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sR3I6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUWgoYS52aWRlb1RhZyk/YS5iYz90aGlzLnYoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlJjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnhnKCksYS56ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5ya3x8dGE7KGZ1bmN0aW9uKGMpe2MudGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlZxKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmYoKSl9fXRoaXMuVCgpfX0sRXc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5wOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS55YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy50a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzVdfWMudW09YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ObTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudW18fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLk1tKDQpOyhmdW5jdGlvbihjKXtjLmltPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5WKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuaW18fHhhOyhmdW5jdGlvbihjKXtjLmhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPXRoaXMuV2M9ITE7dGhpcy5DaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudGM9dGhpcy5YZz0hMTt0aGlzLlJyKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5zaCgpLHRoaXMuZm8oKSx0aGlzLnJiKCkpfSxScjpmdW5jdGlvbihiKXtyZXR1cm4gZS5BYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwKIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlgsIjsiLHR5cGVvZiBiLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWD9iLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlg/dHlwZW9mIGIuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6CiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KPwp0eXBlb2YgYi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNoKX0semI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJgoodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYj10aGlzLnpiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sS2c6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy56YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxUcTpmdW5jdGlvbigpe2lmKCF0aGlzLldnKXt2YXIgYj0KdGhpcy56YigpLGE9dGhpcy5ScSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuV2c9ITApfXJldHVybiB0aGlzLldnfSxScTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuV2MmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLldjPSEwKTtyZXR1cm4gdGhpcy5XY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuJHMoKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sJHM6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuS2coKTtpZihifHx0aGlzLnZhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0KITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZmEoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxEdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGcmJmIuYWRzJiYodGhpcy5wZz1iLmFkcyk7cmV0dXJuIHRoaXMucGd9LGZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApOwp0aGlzLnMoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLktnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuVHEoKSl7dmFyIGE9dGhpcy56YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnpiKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuemIoKX1lbHNlIHRoaXMuWGc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy56YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6KHRoaXMuZmEoITApLHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSw1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGhvOmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMueWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnljIT1iLmFkcy5zdGF0ZSYmKHRoaXMueWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLnljKXt0aGlzLnYoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMueWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhvKCl9LmJpbmQodGhpcyksMTApfSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxDYTpmdW5jdGlvbigpezA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnZhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sCm9vOmZ1bmN0aW9uKCl7dGhpcy5Nd3x8KDEwPHRoaXMubXY/KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5tdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmd0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9vKCl9LmJpbmQodGhpcyksNTApKSl9LGd0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm52KXt0aGlzLm52PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuaG18fHlhOyhmdW5jdGlvbihjKXtjLmptPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5SaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUmgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUmg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLkljKX19KX0pKGMpO3ZhciB6YT1jLmptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMucHE9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuRnA9YjtiLnByb3RvdHlwZT17QWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FaTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkZwfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuQWooNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxKczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkNiLGg9dGhpcy5rYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7dmFyIENhPWMucWx8fENhOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZWF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIucygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnphKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy50cD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnRwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuSnMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMucGx8fERhOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5tYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLnJsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuZG09dGhpcy5hWzddO3RoaXMuQms9dGhpcy5hWzEwXTt0aGlzLmtuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMubnQ9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG06dGhpcy5BayhhKX0sQWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJrOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT0KYy5udHx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2Mudm4oNCk7KGZ1bmN0aW9uKGMpe2Muams9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuSGcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5Mcz1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0OwpoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkxzKXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuamQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmpkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5qZCl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG5vOmZ1bmN0aW9uKCl7ZS5kaCh0aGlzLmpkKTtlLkZlKHRoaXMuamQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSwKSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmprfHxIYTsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zKCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5pa3x8SWE7KGZ1bmN0aW9uKGMpe2Mua2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuSGcoYiwiZWxlbWVudElEIik7aWYoZS5kaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIEphPWMua2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ebz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLm9sPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMub2x8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkNvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy4kaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT0KYX0seHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLiRqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZmI9YTt0aGlzLkNnPXRoaXMub2k9ITE7dGhpcy50aD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZmI9bmV3IHooYSkpO3ZhciBjPXRoaXMudGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuZmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UueHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmFrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkNnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdHJ5e3RoaXMuU2g/dGhpcy50Yi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMub2l8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy50Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuSWUodGhpcy5mYi51cmwpP2wuTmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5JZSh0aGlzLmZiLnVybCksdGhpcy50aCYmdGhpcy50aCgpfXJldHVybiB0aGlzLnRifX19KShjKTt2YXIgTWE9Yy5ha3x8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPQp0aGlzLldkPSExfWMua2o9YjtiLnByb3RvdHlwZT17QnQ6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxBdDpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGV0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17YXc6IkFkQ2xpY2tUaHJ1IixjdzoiQWRFcnJvciIsZHc6IkFkU3RvcHBlZCIsZ3c6IkFkTGluZWFyQ2hhbmdlIixodzoiQWRUYWdQYXJzZWQiLGx3OiJBZFZpZGVvQ29tcGxldGUiLHB3OiJBZExvYWRlZCIscXc6IkFkU2tpcHBlZCIscnc6IkFkU3RhcnRlZCIsZXc6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdzoiQWRJbXByZXNzaW9uIixidzoiQWRDcmVhdGl2ZVZpZXciLGl3OiJBZFZpZGVvTWlkcG9pbnQiLGt3OiJBZFBhdXNlZCIsCm53OiJBZFZpZGVvU3RhcnQiLG93OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGR0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5WZClmb3IodmFyIGIgaW4gdGhpcy5GYS5WZCl0aGlzLkZhLlZkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5WZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYS5nZXRFcnJvcigpOwphJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuZXQoKTt0aGlzLkZhJiZ0aGlzLmR0KCl9fX0pKGMpO3ZhciBOYT1jLmtqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmplPXRoaXMudmM9dGhpcy54Yj1udWxsO3RoaXMuSG89dGhpcy5KYj10aGlzLmtoPSExO3RoaXMuSmE9IiI7dGhpcy5maD0hMTt0aGlzLnVhPXRoaXMub2Q9IiI7dGhpcy5haD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLkJhPVtdO3RoaXMuUWc9dGhpcy5mYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuS2Q9W107dGhpcy5nYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRGM9ITE7dGhpcy5wbz10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLmxjPXRoaXMudWc9dGhpcy53Zj10aGlzLk5kPXRoaXMubGU9dGhpcy5RYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnBkPTA7dGhpcy5TZz0hMTt0aGlzLlJnPTFFMzt0aGlzLlljPSExO3RoaXMuUWE9MUUzO3RoaXMuUWY9IiJ9Yy5iaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLndjLGFkdGFnbW9kaWZpZXI6dGhpcy54YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMudmMsCmFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5raCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5Ibyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLmZoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLnVhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5haCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5mYyxob21hZEFkcGF0aDp0aGlzLlFnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5JZixIT01BRF9CTE9DS0VEOnRoaXMuR2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMubmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLkhmLHRlc3RIaWRlOnRoaXMuaGMsdGVzdFRhZ3M6dGhpcy5pYyx0ZXN0VGFnc0pTOnRoaXMuamMsCnRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLnBvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubGMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5ZYyxhZEZhbGxiYWNrVVJMOnRoaXMuUWZ9fSxmcTpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYKMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLlFuKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLndhKGEpO2Y/KHRoaXMucmQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuQmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy53Y3x8dGhpcy54Ynx8dGhpcy52Y3x8dGhpcy5qZSkmJihnPXRoaXMuTXIoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5QcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHJkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sUHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIueXc7cmV0dXJuIm5vbmUifSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuS2hdfSxCZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMucWQoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0scWg6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS53YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucWgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLnFoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LE1yOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLnhiKWZvcih2YXIgYiBpbiB0aGlzLnhiKXRoaXMueGIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueGJbYl0pKTt0aGlzLnZjJiYoYT10aGlzLkxyKGEsdGhpcy52YykpO3JldHVybiBhfSxtbzpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5pbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxpbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuQnQoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkF0KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLmZoPSEwO3RoaXMub2Q9YTt0aGlzLnVhPWI7dGhpcy5hZj0KZDt0aGlzLlBkPWY7dGhpcy56Yz1jO3RoaXMuRGE9ZXx8e307dGhpcy5tbygpO3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy5BcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9Yix0aGlzLnhjKCl9Y2F0Y2goayl7dGhpcy5oYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy5vZCt0aGlzLmdlKCJnbG9iYWwiKSksdGhpcy5jcS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiZ2xvYmFsIik7CiJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sQXI6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMudWErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5EYSYmdGhpcy5EYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRGEmJnRoaXMuRGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9CndpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuemM9ITEpO3RoaXMuemMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy56Yz90aGlzLnpjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlk9dGhpcy5haD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5HZikpO3RoaXMuTmIoKTtlLkFjKGsuRHMpOyhiPWUuQ2ModGhpcy5xZCgpKSl8fChiPWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGNxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPQp0aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZmN8fHRoaXMuSmF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy51YX1lbHNlIGE9dGhpcy51YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7CnRoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLlFnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQmEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5mYyYmdGhpcy5KYSYmdGhpcy5CYS5sZW5ndGg/dGhpcy5GYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX0sRmM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5CZCgpKSxkPXRoaXMud2EodGhpcy5mYyk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5mYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5jdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuT2w/dGhpcy5oYSgibm9TVk1Db25maWciKToodGhpcy5PbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuRmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGN1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuRGM9ITA7dGhpcy5GYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuTWIoYi5zdHJpY3QpO3RoaXMud2Y9dGhpcy5NYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy51Zz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5oYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmpjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLndjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMueGI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMudmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmplPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmtoPWIuanNwb3B1cHN8fCExO3RoaXMuSmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMubGM9Yi52cGFpZHx8ITE7dGhpcy5EYS52cGFpZD10aGlzLmxjO3RoaXMuTmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5aYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMubGk9Yi52bWFwc3x8IiI7dGhpcy5ZYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUWE9CmIuYml0cmF0ZXx8MUUzO3RoaXMuUWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuZ2M9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5XcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmdjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuRGM9ITAsdGhpcy5GYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5KdSgpJiYodGhpcy5oY3x8dGhpcy5qY3x8dGhpcy5pY3x8dGhpcy5nY3x8dGhpcy5LZCk/dGhpcy5hZj8odGhpcy5VYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLm5lKCksdGhpcy5OYigpKTp0aGlzLm11KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubnUoKSl9fSwKbXU6ZnVuY3Rpb24oKXt0aGlzLmx1KCk7dGhpcy5vdSgpfSxvdTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmFhKDEwKSxnPWUuYWEoMTApLEg9ZS5hYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS55YihhKGMpKSsKYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5oZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5EYSYmdGhpcy5EYS5wbGF5ZXImJnRoaXMuRGEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7cmV0dXJufXRoaXMuaGEoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG51OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpfSxNYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLlVhPSEwLApkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxsdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmpoKCkpdGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5pYz10aGlzLktkKSYmdGhpcy5pYy5sZW5ndGgpe3ZhciBkPXRoaXMuaWMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5wZigpfSxydTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuS2EobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuc3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmpjJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LHN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0scGY6ZnVuY3Rpb24oKXt0aGlzLmdjPyh0aGlzLnNmKyssdGhpcy5LYShuZXcgeih0aGlzLmdjKSx0aGlzLmt1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuVGgoKX0scWY6ZnVuY3Rpb24oYSl7dGhpcy5NYyh0aGlzLkhmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIisKYSl9LGt1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKTt0aGlzLm5lKCl9LGpoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sTmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVmEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLAphKyIiK2IsITApOyIxIj09PWImJihlLkFhKCJ0LW9ubGluZS5kZSIpfHxlLkFhKCJnaWdhLmRlIil8fGUuQWEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuamgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSWYpKTt0aGlzLlBkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUGQmJnRoaXMuUGQoKX0sbG86ZnVuY3Rpb24oKXtpZih0aGlzLndmJiZ0aGlzLmZxKCkpe3ZhciBhPXRoaXMuT3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LCRoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMucGR8fAoodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlJnJiYhdGhpcy5TZyYmKHRoaXMuU2c9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlJnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLm9pPSEwKTtjJiZlLldxKCkmJihhLkNnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxqbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMucmQoKXx8KGE9dGhpcy53YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxqdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0sa286ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdi5iaW5kKHRoaXMpLHRoaXMuYnYuYmluZCh0aGlzKSl9LGN2OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMucHAoKX0sYnY6ZnVuY3Rpb24oKXt9LHBwOmZ1bmN0aW9uKCl7ZS5BYyhrLm9wKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5KYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSxKdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHliOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmJrfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaT10aGlzLmFbNV07dGhpcy5rcT10aGlzLmFbM107dGhpcy5DaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbOV07dGhpcy53cT10aGlzLmFbMV07dGhpcy56az10aGlzLmFbM107dGhpcy5BbT10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy5Jdj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5ycj1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTGk6dGhpcy5qcShhKX0sCmpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ2k6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy55ayhhKX0seWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnprOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BbTp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudWo6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMucnJ8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmcuUD90aGlzLmJiPWEuZy5QKCk6dGhpcy5iYj0iIjthLmcuWmcmJmEuZy5aZyh7cGF1c2U6dGhpcy54ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuWHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZzt0aGlzLlZiPXRoaXMuWGM9ITE7dGhpcy5Obj0xRTM7dGhpcy5yYT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlduPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlZjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmCih0aGlzLlZjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5nKSYmdGhpcy5iLmcudSYmKGE9dGhpcy5iLmcudSgpKSx0aGlzLlZjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudWg9dGhpcy5HZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy53bz1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5lZD10aGlzLm9mPXRoaXMuc2I9dGhpcy5tYz0KdGhpcy53aD10aGlzLmtkPXRoaXMuTXU9dGhpcy52Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLnlzPTIwMDt0aGlzLkRmPXRoaXMuRWY9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy53ZD17fX1jLldqPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLiRiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5JZCgiY2FsbCIsdGhpcy5aYSgpKTtlLncoay5UbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxMZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnZiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihnPSEwKTtpZih0aGlzLkwuWSl0aGlzLm1mKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5MLmxvKCksYz1sLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm5oLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5sYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmcuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZy5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5MZShhLGIsZCl9LDUwKX19LFdlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5RZD10aGlzLk9iPXRoaXMua2Q9ITE7dGhpcy5jPWE7dGhpcy5HdCh0aGlzLmMpO3RoaXMud2Q9bmV3IFFhKHRoaXMuYy5ndix0aGlzLnZpZGVvLHt9KTt0aGlzLk5nKGEpO3RoaXMucmM9dGhpcy5FZyhhKTt0aGlzLnFvKCl9LE5nOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkhkPXRoaXMuWnAoYSkpLHRoaXMuTmcoYS5wYXJlbnQpKX0sRWc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZgpifHwoYz10aGlzLkVnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnAoYSkpKTtyZXR1cm4gY30sSnA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuWGQuY29kZT9lLncoay5Cdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLk1lKCksYj09Ri5MZi5jb2RlJiZlLncoay5Tcix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5ucCx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuSWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkpmLmNvZGU6ZS53KGsuZHYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5NZi5jb2RlOmUudyhrLkV2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LllkLmNvZGU6ZS53KGsuSnYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpOwpicmVhaztjYXNlIHcuVWQuY29kZTplLncoay5Ucix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLncoay4kdSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRmYuY29kZTplLncoay5hdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuS2UoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LApHdDpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuWXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5ibiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5YbShiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuSWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuJG0oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuc28oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkV0KCkpOnRoaXMuYy5vcmlnaW4udmcody5VZCl9LEV0OmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnNiPXRoaXMubWM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5uZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMuc2I9ITApO2Uub2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnRhJiZlLmFuKHRoaXMuYy5vcmlnaW4udGEpO2UuZ2IoInNldFVwVnBhaWQiKTt0aGlzLklkKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnhoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuYnEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZWcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnJjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMucHYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5xdigpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9CiEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy51digpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMueXYoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMud3YoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMueHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy56digpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy52digpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5taSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsubWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLlljJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnR2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5jZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5FZiYmCih0aGlzLkRmPSExLHRoaXMuZWMoKSksdGhpcy5zdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMuc2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLnZmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5iZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sc3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubWM9ITF9LHV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHF2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZ2IoImltcHJlc3Npb24iKTt0aGlzLlBoKCk7ZS53KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZ2IoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx3djpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO2UuZ2IoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LHh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmdiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5nYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx2djpmdW5jdGlvbigpe3RoaXMueWYoKTtlLmdiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LG1pOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZ2IoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxwdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmdiKCJlcnIiLGIpO2UudyhrLkF2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5taSghMCl9LFhtOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5yZCgpKXt2YXIgZD1iLndhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubHYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5ObikpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5YYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlhjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC51Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuaHYoKTt0aGlzLmhpKCk7dGhpcy5mZygpO3RoaXMuYi54aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlNmKCl9LFNmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5TZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLlJtLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSxVbTpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjwKYS5sZW5ndGg7ZisrKWM9ZS5JZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLld0KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5SZCYmdGhpcy5VbSh0aGlzLmMuUmQpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5RZHx8KGUudyhrLlZyLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnVifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLlZiPXRoaXMuWGM9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5vZj0KITA7dGhpcy5iLkJlKCk7dGhpcy5hYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudWImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucmgoKTp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxsdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5qbygpO3RoaXMuYy5vcmlnaW4udmcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5NdSl0aGlzLlJhKCk7CmVsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZy5MYSYmIXRoaXMub2YmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmNkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlJ1KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YiwKcGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnViPyh0aGlzLlZiPXRoaXMuWGM9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6CnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy53aHx8KHRoaXMud2g9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFJ1OmZ1bmN0aW9uKGEpe2UudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZiKSx0aGlzLnZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5QaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlVmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLlJmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYKKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmNpPWEpfSxJZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sUGg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHwKdGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMud2QmJnRoaXMud2QudHJhY2smJnRoaXMud2QudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuJHAodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkhkLmltcHJlc3Npb25zJiZlLlVxKGcudXJsLHRoaXMuSGQuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsCmcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5TbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLkZvKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuRWYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5XbShjKSxmfHwoZj10aGlzLnRnKSxlfHwoZT10aGlzLnRnKSx0aGlzLlltKGEpLHRoaXMuTC5LYShiLApmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LHFvOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sWnQ6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sJHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxGbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuanYuYmluZCh0aGlzKSl9LApqdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLncoay5tZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWWMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOgooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuWmMmJihiPXRoaXMuTC5aYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5BYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LApBYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLndvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0KIkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksCmcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk91LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTnUuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkJiKCk7dGhpcy5BYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksCmwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSksCnRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5CYigpO3RoaXMuQWIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy54YSYmKHRoaXMueGEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmJnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsubmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlFlKCkpO3RoaXMuQmIoKX19LEJiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx4ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLlRjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LE91OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFh1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5RYyl8fHRoaXMudWg/KHRoaXMuZWQ9ITAsdGhpcy52YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52YiksdGhpcy52Yj0hMSksdGhpcy5vZygpKToodGhpcy51aD10aGlzLkVmPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZWcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuWnQoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnlzKToodGhpcy5vZj0hMCx0aGlzLmIuQmUoKSx0aGlzLmIuaXQoKSx0aGlzLmFjPSExLGUudyhrLnZvLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy54ZSgpLkdoKCkpfSwKeGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sZmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnhkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuV24rIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSmcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkpnKCkpO3JldHVybiBhfSx0ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuV2p8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLnl1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMubG49YjtiLnByb3RvdHlwZT17RHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkVxOnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55dTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMubG58fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsCm5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5EcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkVhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMucWM9dGhpcy5zYz0hMTt0aGlzLnRhPSIiO3RoaXMuQmY9ITE7dGhpcy5VZz0iIjtkJiZkLmVtcHR5P3RoaXMuRnIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5lbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5oZCgpLGI7Yj1lLndhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTsKYj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC55YShsLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucWcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuSmQoYSkpKyImdHlwZT1qcyIsYj1sLnlhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwueWEobC5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS4kYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuJGJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLiRifHx0aGlzLlpxKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLmp1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LFpxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sRXI6ZnVuY3Rpb24oYSl7dGhpcy5TcyhhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5VZz1hLnJlc3BvbnNlVVJMO3RoaXMuWC5sZW5ndGg/dGhpcy5IYygpOnRoaXMucWEodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLkJmP0YuWGQ6CkYuS2Z9KSl9LEZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5YLmxlbmd0aD90aGlzLkhjKCk6dGhpcy5xYSh0aGlzLlNhKHcuT2Mse2Vycm9yOnRoaXMuQmY/Ri5YZDpGLktmfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5TYSh3LkpmLHtkZXB0aDphfSkpfSxIYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLmFyKCk/dGhpcy50dSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLk9nKCksaCx7QWRTeXN0ZW06dGhpcy5JcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnFhKHRoaXMuU2Eody5NZikpOihhPTAsdGhpcy5ZdSgpJiZ0aGlzLldlKHRoaXMueG8oKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMuc2M/Cih0aGlzLnNjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkhjKCkpOnRoaXMucGFyZW50LlJlKCl9LHJoOmZ1bmN0aW9uKCl7dGhpcy5xYz8odGhpcy5xYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5IYygpKTp0aGlzLnBhcmVudC5yaCgpfSxZdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1KCk/dGhpcy5wdSgpPyEwOigtMSE9dGhpcy5CYygpP3RoaXMucWEodGhpcy5TYSh3LlRkKSk6dGhpcy5xYSh0aGlzLlNhKHcuRmYpKSwhMSk6KHRoaXMucWEodGhpcy5TYSh3Lk9jLEYuTGYpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVWcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5OZSgpKTthLnViPWEudWI/YS51Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5CZzt0aGlzLnBhcmVudC5XZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5CYygpO2EuTz10aGlzLkxnKCk7YS5VYj10aGlzLktwKCk7YS5ndj1bXTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkhwKCk7YS5sZj10aGlzLllwKGEuZHVyYXRpb24pO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYil7dGhpcy50YXx8KHRoaXMudGE9IiIpO2IuJGE9Yi4kYT9iLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHAoKSk6Yi5QYS5jb25jYXQodGhpcy5UcCgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LldiJiZ0aGlzLnBhcmVudC5XYihiKSxhPTAsdGhpcy5IYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGIpLGE9MCl9LFdiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LldiKGEpfSx2ZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx0dTpmdW5jdGlvbigpe3JldHVybiBhPGh9LHF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5MZygpLmxlbmd0aH0scHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkJjKCl9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LFNzOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxhcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2coKS5sZW5ndGh9LE9nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sSXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmJoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5iaChhLnBhcmVudE5vZGUpOiExfSxUcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxMcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCkxnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHp3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxIcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLm5kKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxCYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFlwOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVnQoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuZW18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR209dGhpcy5hWzFdO3RoaXMuVnU9dGhpcy5hWzddO3RoaXMubXQ9dGhpcy5hWzhdO3RoaXMuUHE9dGhpcy5hWzZdO3RoaXMuQ249dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMV19Yy5Sbj1iO2IucHJvdG90eXBlPXtGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMubHQoYSl9LGx0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUHE6CnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dbjp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlJufHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5GbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQT10aGlzLnBjPXRoaXMudWI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5zbD1iO2IucHJvdG90eXBlPXtzbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxScDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRWEpe3ZhciBhPXRoaXMub3JpZ2luLkVhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxKZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5ScCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sYnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLnNsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbNl07dGhpcy55aT10aGlzLmFbOF07dGhpcy5jcj0KdGhpcy5hWzRdO3RoaXMub209dGhpcy5hWzddO3RoaXMubWo9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNV19Yy5Fbz1iO2IucHJvdG90eXBlPXtIbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW06dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Fb3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuSG0oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsCmNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE9hOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LE1mOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSwKSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxadjp7dHlwZToiZXJyb3IiLApjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtLZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxMZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSwkdjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbN107dGhpcy5icD10aGlzLmFbMl07dGhpcy5ucz10aGlzLmFbN107dGhpcy5Taj10aGlzLmFbNF07dGhpcy5BaT10aGlzLmFbNl07dGhpcy55cT10aGlzLmFbMl07dGhpcy5LdD10aGlzLmFbMV07dGhpcy5pcj10aGlzLmFbNV07dGhpcy5JdD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLkVtPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52czp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYnA6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tajp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWk6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlxOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLkt0OnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pcjp0aGlzLkh0KGEpfSxIdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkVtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy51cyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuQ2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DcT10aGlzLmFbNF07CnRoaXMudXE9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzNdfWMuSXM9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNxOnRoaXMudHEoYSl9LHRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51cTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuSXN8fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkJxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLk9kPVtdO3RoaXMuRWg9W107dGhpcy5TZT1bXTt0aGlzLmt2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7CnRoaXMuTSgpfWMuTWs9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtlLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGc9ZS5jb250ZW50V2luZG93O2cuVXc9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuZnQuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuWHMuYmluZCh0aGlzKX07dmFyIGs9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmsub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtnLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7dGhpcy5PZC5wdXNoKHtzcmM6YyxmcmFtZTplLENzOmYsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlNlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuU2VbYl07Yy50eXBlPT09YSYmYy4kbih0aGlzLk1wKGEpKX19LE1wOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e2N4OiEwLGJ4OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e1F3OiJ2aWRlbyIsZXg6ImpzQ3VzdG9tIixmeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxneDoxLEF3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sYXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLk9kLmxlbmd0aDtiKyspaWYodGhpcy5PZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLk9kW2JdLkNzO3JldHVybiIifSxmdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuYXEoYiksdmVuZG9yOmJ9KTsKdGhpcy5YdCgpfSxYczpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMua3YubWFwKGZ1bmN0aW9uKGEpe3RoaXMuY2coYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5jZyhhLGIpfSxjZzpmdW5jdGlvbihhLGIpe3RoaXMuU2UucHVzaCh7dHlwZTphLCRuOmIsJHc6ITF9KX0sWHQ6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLlhxfHwoYS5Udyh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuZHgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLlhxPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO3ZhciBRYT1jLk1rfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kaz10aGlzLmFbMTBdO3RoaXMuTmw9dGhpcy5hWzNdO3RoaXMuTHY9CnRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLnBqPXRoaXMuYVs5XTt0aGlzLmtyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzddfWMuRmk9YjtiLnByb3RvdHlwZT17Wms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRrOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ObDp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTHY6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhrOnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLkZpfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuWmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5nPWE7dGhpcy5qYj1hLkdnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuZGc9ITE7dGhpcy5UYj1bXX1jLm5qPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYsCnk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5pcShhKSxnPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtnPXt4OmIseTpjfTtmJiYoZy5wb3NpdGlvbj1mKTtyZXR1cm4gZ30sYnU6ZnVuY3Rpb24oKXt0aGlzLmRnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0seGg6ZnVuY3Rpb24oKXt0aGlzLmcucGF1c2UoKTtlLncoay5jZCx0aGlzLmcudSgpKX0saXQ6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5nLnBsYXkoKSxlLncoay5kZCx0aGlzLmcudSgpKSl9LGtmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuamIpO3RoaXMuZy5KYyYmdGhpcy5nLkpjKCk/dGhpcy5nLkdnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sCmlxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx4cDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueHAodGhpcy5qYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5nLkpjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5RaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxiZzpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMubmp8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLll2PXRoaXMuYVs2XTt0aGlzLmdwPXRoaXMuYVs2XTt0aGlzLk10PXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLndqPXRoaXMuYVs5XTt0aGlzLndpPXRoaXMuYVs5XTt0aGlzLlNpPXRoaXMuYVs3XTt0aGlzLnpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLkJzPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnY6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLll2OnRoaXMuZnAoYSl9LGZwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncDp0aGlzLkx0KGEpfSxMdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXQ6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJzOgp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLndpOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Cc3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuTXYoNCk7KGZ1bmN0aW9uKGMpe2Muamw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwKKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5EZChiKTt0aGlzLnJnKCl9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxyZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiYKYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5qbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuaWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlZmPXRoaXMuWGY9CnRoaXMuWWc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMudXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWWcmJnRoaXMubGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYWQoKTt0aGlzLllnPSEwO3RoaXMubGcoKX0uYmluZCh0aGlzKSk7CnRoaXMuaGcoKX0sbGc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5hZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5hZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVmYmJiF0aGlzLlhmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0sYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE1nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGhnOmZ1bmN0aW9uKCl7aWYodGhpcy5hZCgpKXt2YXIgYj0KdGhpcy5NZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlhmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVmY9Yi54d310aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLk93KCk6ITF9LEJjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5CYygpOi0xfSxVcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx1cDpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMucygiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCl9LmJpbmQodGhpcyksMTAwKX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlVwKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuaWx8fGRiOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWXE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ud2wuTG0uSm0/d2luZG93Lk9PLndsLkxtLkptLnZ3KGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZcSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMua2x8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jcj10aGlzLmFbNV07dGhpcy5xaz10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbMl07dGhpcy5qPQp0aGlzLmFbOF19Yy5Jaz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXI6dGhpcy5wayhhKX0scGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFrOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuSWt8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkhyKDQpOyhmdW5jdGlvbihjKXtjLmFqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5QZygpfSxQZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7CmJ8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlYoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LApOYTpmdW5jdGlvbigpe3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlcmJigwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLmFqfHxoYjsoZnVuY3Rpb24oYyl7Yy4kaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxpZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnYoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnBhKCk6dGhpcy5tKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5pZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmlnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LERoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwKKGIuRGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudnB8fCh0aGlzLnZwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5EaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuRGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixUPW5ldyBqYihyKTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRW49dGhpcy5hWzVdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuR2s9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsyXTt0aGlzLm1rPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLnlsPXRoaXMuYVs0XTt0aGlzLmV1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuT289YjtiLnByb3RvdHlwZT17RG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVuOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kajp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxqOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHI6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlsOnRoaXMuZHUoYSl9LApkdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmV1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Pb3x8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuRG4oNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSmM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLlVsfHxVOyhmdW5jdGlvbihjKXtjLlRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuVWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnYuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTsKeS5VYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmFzKGEpfS5iaW5kKHRoaXMpKTt5LlVjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuVWMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LmVxKCl9LGFzOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudigpO3RoaXMucGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwKMTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLnYoKTt0aGlzLnBhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5UbHx8VjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy52ZCYmKGI9ZS5HbyhiLHRoaXMudmQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7CnZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmYoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy52ZHx8KHRoaXMudmQ9W10pLHRoaXMudmQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFVjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LHV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuR2N8fAoodGhpcy5HYz1bXSksdGhpcy5HYy5wdXNoKGIpLHRoaXMuaHQoKSYmKHRoaXMuY2YoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sZXE6ZnVuY3Rpb24oKXtpZih0aGlzLkdjKWZvcih2YXIgYj0wO2I8dGhpcy5HYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkdjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPQpiLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkudXUoYil9fSl9KShjKTt2YXIgbGI9Yy5WbHx8bGIseT1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbMl07dGhpcy5rdD10aGlzLmFbNF07dGhpcy5tcj10aGlzLmFbNl07dGhpcy52az10aGlzLmFbMV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5JdT10aGlzLmFbOF07dGhpcy5DdT10aGlzLmFbOF07dGhpcy5Waz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkZxPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ncjp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1yOnRoaXMudWsoYSl9LAp1azpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudms6dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkF1OnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5JdTp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3U6dGhpcy5VayhhKX0sVWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5GcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnYoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpOwphLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuWWl8fG9iOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgbmIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgb2IoZSx0aGlzLkkpKS5mKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9CmIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuWml8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Uaz10aGlzLmFbNl07dGhpcy5Bcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnVyPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ubjp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGo6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vazoKdGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5pOnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Uazp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLnVyfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5tbig0KTsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuV3ModGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sV3M6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWmc6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5Ya3x8c2I7KGZ1bmN0aW9uKGMpe2MuV2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5pPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm5hKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLldrfHx0YjsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5JKSkuZigpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpO3ZhciB1Yj1jLllrfHx1YixXPW5ldyB1YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucnA9dGhpcy5hWzRdO3RoaXMua3A9dGhpcy5hWzNdO3RoaXMuRHA9dGhpcy5hWzddO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuaWo9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuaWp8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnFwKDQpOyhmdW5jdGlvbihjKXtjLmxtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLmxtfHx3YjsoZnVuY3Rpb24oYyl7Yy5rbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sVXM6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE/dGhpcy5Vcyh0aGlzLnphKToodGhpcy56YT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuemEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmCnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5lYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5lYlthXSYmMzAzIT10aGlzLmViW2FdJiY0MDMhPXRoaXMuZWJbYV0mJihiPSExKTtpZihiKXRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLmttfHx4YjsoZnVuY3Rpb24oYyl7Yy5tbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5JKSkuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLm1tfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnE9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuaGs9YjtiLnByb3RvdHlwZT17SXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuaGt8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLklxKDQpOyhmdW5jdGlvbihjKXtjLklsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVihiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuS3MoKX0uYmluZCh0aGlzKSw1MDApfSxLczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFl0OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Lcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Lcj8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWXQoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLkhsfHxDYjsoZnVuY3Rpb24oYyl7Yy5KbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuSmx8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdT10aGlzLmFbMV07dGhpcy5mdj10aGlzLmFbNV07CnRoaXMuZXM9dGhpcy5hWzZdO3RoaXMuTHE9dGhpcy5hWzJdO3RoaXMucW49dGhpcy5hWzEwXTt0aGlzLlFvPXRoaXMuYVs0XTt0aGlzLmxzPXRoaXMuYVs5XTt0aGlzLndtPXRoaXMuYVszXTt0aGlzLmpzPXRoaXMuYVsxMF07dGhpcy5XaT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs2XX1jLmRqPWI7Yi5wcm90b3R5cGU9e0t1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmVzOnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5McTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucW46dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Rbzp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy52bShhKX0sCnZtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53bTp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpzOnRoaXMuVmkoYSl9LFZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuZGp8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLkt1KDQpOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7CnZhciBHYj1jLkRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMudnIoKTp0aGlzLmtnKCk7Yi5hdXRvcGxheSYmCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHRvOmZ1bmN0aW9uKCl7dGhpcy5UZigpfHx0aGlzLm0oITApfSx2cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5vYSYmYi5YJiZiLnV3JiZiLnd3JiYodGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2coKX0uYmluZCh0aGlzKSwxMDApfSxtZDpmdW5jdGlvbigpe2lmKCF0aGlzLnZoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy52aD1iW2NdKTtyZXR1cm4gdGhpcy52aH0sUHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5DbHx8SGI7KGZ1bmN0aW9uKGMpe2MuRWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmYoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLkVsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzFdO3RoaXMuSGk9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs5XTt0aGlzLmVyPXRoaXMuYVsxXTt0aGlzLm1xPXRoaXMuYVs1XTt0aGlzLml1PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMud3A9CmI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5obDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5IaTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3I6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMubHEoYSl9LGxxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tcTp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLndwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5nbCg0KTsKKGZ1bmN0aW9uKGMpe2MuS2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5WKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxOdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxKYzpmdW5jdGlvbigpe3JldHVybiEwfSxJYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuS2t8fFg7KGZ1bmN0aW9uKGMpe2MuSms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLlZ3KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmt8fFk7KGZ1bmN0aW9uKGMpe2MuTGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5mKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5tYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBHLExiPWMuTGt8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuZ3U9dGhpcy5hWzJdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzNdO3RoaXMuV3Y9dGhpcy5hWzEwXTt0aGlzLmZqPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLld1PWI7Yi5wcm90b3R5cGU9e2ZzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nczp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3U6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbzp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmo6dGhpcy5WdihhKX0sVnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLld2OnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuV3V8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLmZzKDQpOyhmdW5jdGlvbihjKXtjLlVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksCmEmJmM/KHRoaXMuVihjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LExhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxTdzpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlVqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Uaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlRqfHxQYjsoZnVuY3Rpb24oYyl7Yy5Waj0KcC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmd2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMoKTtpZihiJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5tYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5mKCkpfX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlZqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Y9dGhpcy5hWzJdO3RoaXMuZm49dGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzhdO3RoaXMueWo9dGhpcy5hWzNdOwp0aGlzLlJzPXRoaXMuYVs4XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs1XX1jLmVrPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hdjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZm46dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLktuOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJzOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmVrfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuQ209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVihhKX1lbHNlIHRoaXMuY2EoKX0sTWQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSwKZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxWczpmdW5jdGlvbigpe3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuU2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlNkfHwodGhpcy5TZD0hMCx0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKTGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLkNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5CbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxaczpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSl9LCRjOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMucygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxQZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPQowO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuJGMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlBmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuWnMod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5QZigpO3RoaXMuWXMoKX0sWXM6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuVHM/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5Ucz0KITB9fSl9KShjKTt2YXIgVWI9Yy5CbXx8VWI7KGZ1bmN0aW9uKGMpe2MuRG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5WcygpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMuRG18fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJHI9dGhpcy5hWzldO3RoaXMuUmw9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOV19Yy5zcT1iO2IucHJvdG90eXBlPXtacjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLiRyOnRoaXMuUWwoYSl9LFFsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuc3F8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLlpyKDQpOyhmdW5jdGlvbihjKXtjLmFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLApiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Rcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnloJiYodGhpcy55aD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMuYW18fE87KGZ1bmN0aW9uKGMpe2MuJGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0semE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5EdCgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuJGx8fFA7KGZ1bmN0aW9uKGMpe2MuYm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLk5rPWI7Yi5wcm90b3R5cGU9e09pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuTmt8fCRiLFhjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLk9pKDQpOyhmdW5jdGlvbihjKXtjLkRrPQp0LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVihhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuQ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmc9MDt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPQp0aGlzLldjPSExO3RoaXMuQ2g9ZS5IYigxMCk7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlZnKys7aWYoMTA8dGhpcy5WZyl0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5tKCEwKTp0aGlzLm0oKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVoLmJpbmQodGhpcyksMTAwKSwhMX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudmEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Da3x8YWE7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgYWM9Yy5Fa3x8YWMsYmM9bmV3IGFjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5CcD10aGlzLmFbMTBdO3RoaXMudHI9dGhpcy5hWzldO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLmJvPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5Qaz10aGlzLmFbN107dGhpcy5Icz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5zaj1iO2IucHJvdG90eXBlPXtBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50cjp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSmk6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xdDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUGs6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2p8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFwKDQpOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7CnZhciBkYz1jLlBqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Paj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qZygpfSxqZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuT2p8fGVjOyhmdW5jdGlvbihjKXtjLlFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsKKG5ldyBlYyhiLHRoaXMuSSkpLmYoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuUWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbj10aGlzLmFbNl07dGhpcy5naz10aGlzLmFbOV07dGhpcy5CbD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbMV07dGhpcy5xcj10aGlzLmFbNV07dGhpcy5Gcz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLlNsPWI7Yi5wcm90b3R5cGU9e2NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kbjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ2s6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJsOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Cbzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLnFyOnRoaXMuRXMoYSl9LEVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuU2x8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmNuKDQpOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5yaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5tZSgpO3RoaXMuZ2coKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSwKZ2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9LG1lOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fApiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMucGl8fGpjOyhmdW5jdGlvbihjKXtjLnNpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMuc2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ycT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmZsPWI7Yi5wcm90b3R5cGU9e3FxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuZmx8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnFxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmdoPXRoaXMuaWg9dGhpcy5oaD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjPwpudWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj8KbnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLnVsPWI7Yi5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuVnAoYSk6W10sYjt0aGlzLmloPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmhoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5naClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYKYSBpbnN0YW5jZW9mIHA/ITA6ITF9LFZwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LCR0OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiB0JiYhdGhpcy5oaClmb3IodGhpcy5naD0hMCxhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnlkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMudWx8fG5jLE09bmV3IG5jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNvPXRoaXMuYVs3XTt0aGlzLlF1PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVs3XTt0aGlzLmhuPQp0aGlzLmFbNl07dGhpcy5TdD10aGlzLmFbMV07dGhpcy5Wbj10aGlzLmFbOV07dGhpcy53dT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLnJvPWI7Yi5wcm90b3R5cGU9e1JvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tbzp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUXU6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5objp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZuOnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5yb3x8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlJvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkFjKGsuWnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkFjKGsuVXIpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsCiIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmphKCk7SS4kZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuamEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLiRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5qYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2UuQWcod2luZG93LEkuTnEoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTsKZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbN107dGhpcy5nbT10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbNV07dGhpcy5Qdj10aGlzLmFbNF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzddO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy56bD1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Sazp0aGlzLk92KGEpfSxPdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHY6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy54cjp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5vOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2w6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy56bHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnpoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy50ZD0wOwp0aGlzLmJiPSIiO3RoaXMuemQ9W107dGhpcy5BZD0wO3RoaXMuQmg9ITE7dGhpcy5aZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXt0aGlzLnpoPWF9LGhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdXQ6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx0dDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxLYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5RcSgpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIudWEsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuS2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLnpjKTtlbHNlIGlmKHRoaXMuZ3EoKSl0aGlzLm90KGZ1bmN0aW9uKCl7dGhpcy5LYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuY2QsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLApnKTtsLnN0KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5KcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkplJiYoYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnRkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudGQuZ2V0VGltZSgpLHRoaXMudGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnRkPWE7cmV0dXJuITF9LFV0OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMud2coYSkpP3RoaXMuS2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5kZCx0aGlzLnBsYXllci51KCkpKX0sVHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuemgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLnp0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLndnKGMpKT90aGlzLktjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5kZCx0aGlzLnBsYXllci51KCkpKX19LHdnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxidDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkZ0KHRoaXMuVHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5vaCl7dGhpcy5vaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5LYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5kZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxhdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnl0KHRoaXMuRmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuT2UoKX0sZjpmdW5jdGlvbigpe3RoaXMuVXQoKTt0aGlzLnBsYXllci5PZSYmdGhpcy5hdCgpO3RoaXMuYnQoKX0sY3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy56ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuVXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkFkPXRoaXMuemQubGVuZ3RofSxncTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5BZCYmKGE9ITApO3JldHVybiBhfSwKb3Q6ZnVuY3Rpb24oYSl7dGhpcy5CaD1hO2ZvcihhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXVsiZnVuY3Rpb24iXSh0aGlzLk9zLmJpbmQodGhpcykpfSxPczpmdW5jdGlvbihhKXt0aGlzLkFkLS07YSYmdGhpcy5aZS5wdXNoKGEpOzA+PXRoaXMuQWQmJnRoaXMuQmgoKX0sSnI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWmUubGVuZ3RoO2MrKyliPXRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUXQ9dGhpcy5hWzZdO3RoaXMucW09dGhpcy5hWzZdO3RoaXMuQXE9dGhpcy5hWzFdO3RoaXMuZXA9dGhpcy5hWzddO3RoaXMuSm89dGhpcy5hWzRdO3RoaXMuT3Q9dGhpcy5hWzVdO3RoaXMuYmw9CnRoaXMuYVs4XTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuUW09YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlF0OnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xbTp0aGlzLnpxKGEpfSx6cTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXE6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kbzp0aGlzLk50KGEpfSxOdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT3Q6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJsOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUW18fHFjLGVkPW5ldyBxYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5QdCg0KX0pLmNhbGwoc2hvaFZvb25waXVOZWFnaSxzaG9oVm9vbnBpdU5lYWdpKTsK
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Sun, 29 Sep 2019 02:01:13 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame A6C7
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvL7k2OB17_0fpBjssqEPY4_NJlXS5hvxLCRsBiYm4mkDIFbvtapVdmEqovg7PRb-JYHI-d9AScVIF1E6Hv0TsjPzbQEb7vrIrHZnrXtzCpJfeorDFReKYEqHo_I5zARm7UpllwuvSEAKxFTHh6ACS4UIuzzQMnSNy0VA635-hdd1SypnEpousO1Xs9pLa_GQwjE8Sd7lHqts5Y84AcdbxUahCPSq8LLlrAlhbyGx4CzelACfUJwWYQ7G2mnn47tNqidQ6tsuuAUTHpeRWbjw&sig=Cg0ArKJSzDTAOtokFsDtEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 29 Sep 2019 01:46:13 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
www.googletagservices.com/tag/js/ Frame A6C7
44 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
8d7d8d0629dc8b94a541f38658e5e6555a42d4162a17a29e283df2044c37e101
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"293 / 986 of 1000 / last-modified: 1569601082"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14244
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:13 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame A6C7
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
40c4598498d723f4f7406649ed88cba3ae85afbbb863e97b2723174e22b2381a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569582964828766"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29649
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:13 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 585E
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=3537374916
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHNob2hWb29ucGl1TmVhZ2k9c2hvaFZvb25waXVOZWFnaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuVWV8fCh5LlVlPTApO3kuVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5abillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5jZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS51dChsKTthLnR0KG0pO2EuY3QoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGE9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5DdCh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzFdO3RoaXMucHM9dGhpcy5hWzRdO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuSHE9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy56bz1iO2IucHJvdG90eXBlPXtZbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmw6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVvOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSHE6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy56b3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWm49ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5vZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLk5zLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5UZz17fTt0aGlzLmVmPSExfWMuWWo9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrCnRoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5UZ1thXSYmKHRoaXMuVGdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5hdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGFuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmCihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxsYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sTnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuTXMoYS5kYXRhKX0sTXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxoZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSwKcWc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMubGgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LElnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFptOmZ1bmN0aW9uKGEsCmIpe2lmKGImJiEoMD50aGlzLndhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuRXAoYSkpcmV0dXJuOyhiPXRoaXMucWcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxFcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx5ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZ2I6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfY2FjaGVfIithLGIsITApfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seWU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxIZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUWg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sCkhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixmLGQ7Zm9yKGY9NzswPD1mO2YtLSlkPWE+Pj40KmYmMTUsaCs9ZC50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHgsdSxyLHA7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgdD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx0LnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IodC5wdXNoKGYpOzE0IT10Lmxlbmd0aCUxNjspdC5wdXNoKDApO3QucHVzaChuPj4+MjkpO3QucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx0Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXRbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eD1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspcD1kKHEsNSkrKG4meHx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9MjA7Mzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTQwOzU5Pj1mO2YrKylwPWQocSw1KSsobiZ4fG4mdXx4JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eCwKeD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NjA7Nzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreCY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxoZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cSkmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxIazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LFBuOmZ1bmN0aW9uKCl7cmV0dXJuIGEuUWkoKXx8YS5jaigpfHxhLm5xKCl8fGEubGwoKXx8YS5ybSgpfHxhLkhrKCl8fGEuUGwoKX19O3JldHVybiBudWxsIT1hLlBuKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sQ2M6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sQWE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sWHA6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEdvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LFZ0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LERnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5kaShiKSsiOiIrdGhpcy5kaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGdmOmZ1bmN0aW9uKGEpe3RoaXMuJGI9YX0sQWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy4kYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKQWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkFnKGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQWMoQil9LFBzOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuWHAoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxXdDpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlBzKGEpO2lmKGIpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5CZCgpO2wueWEoYSwhMCk7YT1sLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuS2EoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLk5jfHwodGhpcy5OYz17fSk7dGhpcy5OY1tmXXx8KHRoaXMuTmNbZl09MCk7dGhpcy5OY1tmXSsrOzEwPHRoaXMuTmNbZl18fChmPQpsLkJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZil7dmFyIGQ9ITE7Zj1mLnJlc3BvbnNlVGV4dDt0cnl7Zj1KU09OLnBhcnNlKGYpLGY9Zi5kYXRhLGZbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGQ9ITApLGZbMV0mJmZbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGQ9ITEpfWNhdGNoKGMpe31kfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZlswXT9mWzBdOiIiKSsoZlsxXT9mWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LApNZTpmdW5jdGlvbigpe2wmJmwuWT9sLmlzRW5hYmxlZCYmbC5rbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxlZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuJHEoYSl8fDA8PQphLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZGYmJndpbmRvdy5zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueWcoYSkpcmV0dXJuIHRoaXMueWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTsKYy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkphLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlptKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIG09ZXx8bDtlPSEwO2smJihlPSExKTtpZihtJiZtLlkpaWYobS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle20ueWEoYSxlKTtlPW0ueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbS5LYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLG0sZyxrKX0uYmluZCh0aGlzKSw1MDApfSxsaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sRHI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMubGgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTGMpZm9yKHZhciBjIGluIHRoaXMuTGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5MY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sbWg6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuSmEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkRyKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkxjPWF9LFV2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxRbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFVxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLllqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlhqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuRHM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLAptZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLlRyPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJ2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5XZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi4kZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlJtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlVmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuZHY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlNyPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9wPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Fdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIiwKbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi52bz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5jZD17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWWY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLlRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5UYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9OwpiLmNlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5TbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iua2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnVkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5uZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuQXY9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9OwpiLiR1PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Vcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbNl07dGhpcy4kbz10aGlzLmFbOF07CnRoaXMubXA9dGhpcy5hWzFdO3RoaXMueW09dGhpcy5hWzNdO3RoaXMuaXA9dGhpcy5hWzhdO3RoaXMuR249dGhpcy5hWzEwXTt0aGlzLnRzPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMuUHI9YjtiLnByb3RvdHlwZT17bnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9yOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubXA6dGhpcy54bShhKX0seG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnltOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pcDp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR246dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5Qcnx8CmphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLm5yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuWmo9YjtiLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxTcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sbGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmxkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMubGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxqYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsKIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamEoKSsiMiJ9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5TcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlpqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkR2PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuWXI9YjtiLnByb3RvdHlwZT17Q3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkR2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuWXJ8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkN2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5qaj1ifSkoYyk7dmFyIEw9Yy5qanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xbz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnlvPWI7Yi5wcm90b3R5cGU9e1ZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlluOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnlvfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Wbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLnRsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5JYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnZ0KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpOjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGNmOmZ1bmN0aW9uKCl7dGhpcy5JYj0KMH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHZ0OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5paCYmTS4kdChiKX0sSHc6ZnVuY3Rpb24oKXtyZXR1cm4gZS55ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LFZxOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy50bHx8cDsoZnVuY3Rpb24oYyl7Yy52bD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPQp0aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5JYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5DYj0iIjt0aGlzLnNnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxJdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LHl0OmZ1bmN0aW9uKGIpe3RoaXMuUGU9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZX0sT2U6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD0KdGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkljKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEdnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGF4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmhxKCl8fHRoaXMuVm0oKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sVm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sCkVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxKZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkNiPWJ9LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2J9LApHaDpmdW5jdGlvbigpe3RoaXMuQ2I9bnVsbH0sTHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkNiJiYoYj0hMCk7cmV0dXJuIGJ9LFd3OmZ1bmN0aW9uKCl7dGhpcy5zZ3x8KHRoaXMuc2c9ITApfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxDdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy52bHx8dDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLk5mPSIxIjt0aGlzLk9mPSIyIjt0aGlzLkttPSIzIjt0aGlzLlBjPTA7dGhpcy5waD0zMDt0aGlzLlJiPVtdO3RoaXMuaGI9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5hZz10aGlzLmdpPQohMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5oZihiKTt0aGlzLnd0KGEpfSxmOmZ1bmN0aW9uKCl7fSxwYTpmdW5jdGlvbigpe3RoaXMuZ2l8fCh0aGlzLmdpPSEwLGUuTWUoKSl9LFRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sTXE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmphKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5qZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuTXEoKTtpZighdGhpcy5TcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5qZigpO3JldHVybn10aGlzLmpmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy4kaCgpO3RoaXMuYWc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMudmEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmhiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSwkaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJgoodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0samY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9mfSxEdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLkttfSxuYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LFRmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSxzdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5PZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUGN9LGhmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnVpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllvPXRoaXMuYVsxXTt0aGlzLkxsPXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLlhsPXRoaXMuYVs2XTt0aGlzLlJ2PXRoaXMuYVs1XTsKdGhpcy5Bbj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLnpqPWI7Yi5wcm90b3R5cGU9e1hvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Zbzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5YbDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnY6dGhpcy56bihhKX0sem46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy56anx8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuWG8oNCk7CihmdW5jdGlvbihjKXtjLkRqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuRGp8fG9hOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLAphPWIudHc7YT9hLm9hP2Eub2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5Fanx8cGE7KGZ1bmN0aW9uKGMpe2MuRmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuRmp8fHFhOyhuZXcgcWEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Mbz10aGlzLmFbNl07CnRoaXMueW49dGhpcy5hWzldO3RoaXMuY3M9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zcD1iO2IucHJvdG90eXBlPXtLbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTG86dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLnNwfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5Lbyg0KTsoZnVuY3Rpb24oYyl7Yy5zaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMueGcoKTt0aGlzLnpnKCk7dGhpcy51bz0hMX0seGc6ZnVuY3Rpb24oKXt0aGlzLmJjPQohMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0semc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpOwphLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5za3x8c2E7KGZ1bmN0aW9uKGMpe2Mucms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMTt0aGlzLmdldFBsYXllcigpOwp2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLndiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy53Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy53Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMud2I9ITApKTp0aGlzLnYoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMucGgmJgohdGhpcy52YSgpJiYodGhpcy53Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudmEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnVvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiYoYS54ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudigib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMudmEoKSYmKHRoaXMud2I/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlNjLmluZGV4T2YoYSkmJgp0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5TYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sR3I6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUWgoYS52aWRlb1RhZyk/YS5iYz90aGlzLnYoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlJjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnhnKCksYS56ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5ya3x8dGE7KGZ1bmN0aW9uKGMpe2MudGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlZxKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmYoKSl9fXRoaXMuVCgpfX0sRXc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5wOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS55YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy50a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzVdfWMudW09YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ObTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudW18fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLk1tKDQpOyhmdW5jdGlvbihjKXtjLmltPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5WKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuaW18fHhhOyhmdW5jdGlvbihjKXtjLmhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPXRoaXMuV2M9ITE7dGhpcy5DaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudGM9dGhpcy5YZz0hMTt0aGlzLlJyKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5zaCgpLHRoaXMuZm8oKSx0aGlzLnJiKCkpfSxScjpmdW5jdGlvbihiKXtyZXR1cm4gZS5BYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwKIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlgsIjsiLHR5cGVvZiBiLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWD9iLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlg/dHlwZW9mIGIuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6CiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KPwp0eXBlb2YgYi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNoKX0semI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJgoodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYj10aGlzLnpiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sS2c6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy56YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxUcTpmdW5jdGlvbigpe2lmKCF0aGlzLldnKXt2YXIgYj0KdGhpcy56YigpLGE9dGhpcy5ScSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuV2c9ITApfXJldHVybiB0aGlzLldnfSxScTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuV2MmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLldjPSEwKTtyZXR1cm4gdGhpcy5XY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuJHMoKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sJHM6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuS2coKTtpZihifHx0aGlzLnZhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0KITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZmEoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxEdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGcmJmIuYWRzJiYodGhpcy5wZz1iLmFkcyk7cmV0dXJuIHRoaXMucGd9LGZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApOwp0aGlzLnMoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLktnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuVHEoKSl7dmFyIGE9dGhpcy56YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnpiKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuemIoKX1lbHNlIHRoaXMuWGc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy56YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6KHRoaXMuZmEoITApLHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSw1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGhvOmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMueWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnljIT1iLmFkcy5zdGF0ZSYmKHRoaXMueWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLnljKXt0aGlzLnYoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMueWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhvKCl9LmJpbmQodGhpcyksMTApfSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxDYTpmdW5jdGlvbigpezA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnZhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sCm9vOmZ1bmN0aW9uKCl7dGhpcy5Nd3x8KDEwPHRoaXMubXY/KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5tdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmd0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9vKCl9LmJpbmQodGhpcyksNTApKSl9LGd0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm52KXt0aGlzLm52PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuaG18fHlhOyhmdW5jdGlvbihjKXtjLmptPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5SaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUmgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUmg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLkljKX19KX0pKGMpO3ZhciB6YT1jLmptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMucHE9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuRnA9YjtiLnByb3RvdHlwZT17QWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FaTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkZwfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuQWooNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxKczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkNiLGg9dGhpcy5rYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7dmFyIENhPWMucWx8fENhOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZWF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIucygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnphKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy50cD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnRwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuSnMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMucGx8fERhOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5tYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLnJsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuZG09dGhpcy5hWzddO3RoaXMuQms9dGhpcy5hWzEwXTt0aGlzLmtuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMubnQ9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG06dGhpcy5BayhhKX0sQWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJrOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT0KYy5udHx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2Mudm4oNCk7KGZ1bmN0aW9uKGMpe2Muams9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuSGcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5Mcz1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0OwpoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkxzKXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuamQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmpkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5qZCl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG5vOmZ1bmN0aW9uKCl7ZS5kaCh0aGlzLmpkKTtlLkZlKHRoaXMuamQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSwKSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmprfHxIYTsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zKCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5pa3x8SWE7KGZ1bmN0aW9uKGMpe2Mua2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuSGcoYiwiZWxlbWVudElEIik7aWYoZS5kaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIEphPWMua2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ebz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLm9sPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMub2x8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkNvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy4kaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT0KYX0seHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLiRqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZmI9YTt0aGlzLkNnPXRoaXMub2k9ITE7dGhpcy50aD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZmI9bmV3IHooYSkpO3ZhciBjPXRoaXMudGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuZmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UueHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmFrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkNnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdHJ5e3RoaXMuU2g/dGhpcy50Yi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMub2l8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy50Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuSWUodGhpcy5mYi51cmwpP2wuTmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5JZSh0aGlzLmZiLnVybCksdGhpcy50aCYmdGhpcy50aCgpfXJldHVybiB0aGlzLnRifX19KShjKTt2YXIgTWE9Yy5ha3x8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPQp0aGlzLldkPSExfWMua2o9YjtiLnByb3RvdHlwZT17QnQ6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxBdDpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGV0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17YXc6IkFkQ2xpY2tUaHJ1IixjdzoiQWRFcnJvciIsZHc6IkFkU3RvcHBlZCIsZ3c6IkFkTGluZWFyQ2hhbmdlIixodzoiQWRUYWdQYXJzZWQiLGx3OiJBZFZpZGVvQ29tcGxldGUiLHB3OiJBZExvYWRlZCIscXc6IkFkU2tpcHBlZCIscnc6IkFkU3RhcnRlZCIsZXc6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdzoiQWRJbXByZXNzaW9uIixidzoiQWRDcmVhdGl2ZVZpZXciLGl3OiJBZFZpZGVvTWlkcG9pbnQiLGt3OiJBZFBhdXNlZCIsCm53OiJBZFZpZGVvU3RhcnQiLG93OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGR0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5WZClmb3IodmFyIGIgaW4gdGhpcy5GYS5WZCl0aGlzLkZhLlZkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5WZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYS5nZXRFcnJvcigpOwphJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuZXQoKTt0aGlzLkZhJiZ0aGlzLmR0KCl9fX0pKGMpO3ZhciBOYT1jLmtqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmplPXRoaXMudmM9dGhpcy54Yj1udWxsO3RoaXMuSG89dGhpcy5KYj10aGlzLmtoPSExO3RoaXMuSmE9IiI7dGhpcy5maD0hMTt0aGlzLnVhPXRoaXMub2Q9IiI7dGhpcy5haD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLkJhPVtdO3RoaXMuUWc9dGhpcy5mYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuS2Q9W107dGhpcy5nYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRGM9ITE7dGhpcy5wbz10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLmxjPXRoaXMudWc9dGhpcy53Zj10aGlzLk5kPXRoaXMubGU9dGhpcy5RYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnBkPTA7dGhpcy5TZz0hMTt0aGlzLlJnPTFFMzt0aGlzLlljPSExO3RoaXMuUWE9MUUzO3RoaXMuUWY9IiJ9Yy5iaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLndjLGFkdGFnbW9kaWZpZXI6dGhpcy54YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMudmMsCmFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5raCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5Ibyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLmZoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLnVhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5haCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5mYyxob21hZEFkcGF0aDp0aGlzLlFnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5JZixIT01BRF9CTE9DS0VEOnRoaXMuR2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMubmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLkhmLHRlc3RIaWRlOnRoaXMuaGMsdGVzdFRhZ3M6dGhpcy5pYyx0ZXN0VGFnc0pTOnRoaXMuamMsCnRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLnBvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubGMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5ZYyxhZEZhbGxiYWNrVVJMOnRoaXMuUWZ9fSxmcTpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYKMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLlFuKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLndhKGEpO2Y/KHRoaXMucmQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuQmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy53Y3x8dGhpcy54Ynx8dGhpcy52Y3x8dGhpcy5qZSkmJihnPXRoaXMuTXIoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5QcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHJkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sUHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIueXc7cmV0dXJuIm5vbmUifSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuS2hdfSxCZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMucWQoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0scWg6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS53YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucWgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLnFoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LE1yOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLnhiKWZvcih2YXIgYiBpbiB0aGlzLnhiKXRoaXMueGIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueGJbYl0pKTt0aGlzLnZjJiYoYT10aGlzLkxyKGEsdGhpcy52YykpO3JldHVybiBhfSxtbzpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5pbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxpbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuQnQoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkF0KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLmZoPSEwO3RoaXMub2Q9YTt0aGlzLnVhPWI7dGhpcy5hZj0KZDt0aGlzLlBkPWY7dGhpcy56Yz1jO3RoaXMuRGE9ZXx8e307dGhpcy5tbygpO3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy5BcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9Yix0aGlzLnhjKCl9Y2F0Y2goayl7dGhpcy5oYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy5vZCt0aGlzLmdlKCJnbG9iYWwiKSksdGhpcy5jcS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiZ2xvYmFsIik7CiJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sQXI6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMudWErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5EYSYmdGhpcy5EYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRGEmJnRoaXMuRGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9CndpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuemM9ITEpO3RoaXMuemMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy56Yz90aGlzLnpjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlk9dGhpcy5haD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5HZikpO3RoaXMuTmIoKTtlLkFjKGsuRHMpOyhiPWUuQ2ModGhpcy5xZCgpKSl8fChiPWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGNxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPQp0aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZmN8fHRoaXMuSmF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy51YX1lbHNlIGE9dGhpcy51YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7CnRoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLlFnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQmEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5mYyYmdGhpcy5KYSYmdGhpcy5CYS5sZW5ndGg/dGhpcy5GYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX0sRmM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5CZCgpKSxkPXRoaXMud2EodGhpcy5mYyk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5mYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5jdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuT2w/dGhpcy5oYSgibm9TVk1Db25maWciKToodGhpcy5PbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuRmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGN1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuRGM9ITA7dGhpcy5GYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuTWIoYi5zdHJpY3QpO3RoaXMud2Y9dGhpcy5NYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy51Zz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5oYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmpjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLndjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMueGI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMudmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmplPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmtoPWIuanNwb3B1cHN8fCExO3RoaXMuSmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMubGM9Yi52cGFpZHx8ITE7dGhpcy5EYS52cGFpZD10aGlzLmxjO3RoaXMuTmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5aYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMubGk9Yi52bWFwc3x8IiI7dGhpcy5ZYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUWE9CmIuYml0cmF0ZXx8MUUzO3RoaXMuUWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuZ2M9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5XcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmdjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuRGM9ITAsdGhpcy5GYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5KdSgpJiYodGhpcy5oY3x8dGhpcy5qY3x8dGhpcy5pY3x8dGhpcy5nY3x8dGhpcy5LZCk/dGhpcy5hZj8odGhpcy5VYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLm5lKCksdGhpcy5OYigpKTp0aGlzLm11KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubnUoKSl9fSwKbXU6ZnVuY3Rpb24oKXt0aGlzLmx1KCk7dGhpcy5vdSgpfSxvdTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmFhKDEwKSxnPWUuYWEoMTApLEg9ZS5hYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS55YihhKGMpKSsKYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5oZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5EYSYmdGhpcy5EYS5wbGF5ZXImJnRoaXMuRGEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7cmV0dXJufXRoaXMuaGEoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG51OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpfSxNYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLlVhPSEwLApkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxsdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmpoKCkpdGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5pYz10aGlzLktkKSYmdGhpcy5pYy5sZW5ndGgpe3ZhciBkPXRoaXMuaWMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5wZigpfSxydTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuS2EobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuc3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmpjJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LHN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0scGY6ZnVuY3Rpb24oKXt0aGlzLmdjPyh0aGlzLnNmKyssdGhpcy5LYShuZXcgeih0aGlzLmdjKSx0aGlzLmt1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuVGgoKX0scWY6ZnVuY3Rpb24oYSl7dGhpcy5NYyh0aGlzLkhmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIisKYSl9LGt1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKTt0aGlzLm5lKCl9LGpoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sTmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVmEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLAphKyIiK2IsITApOyIxIj09PWImJihlLkFhKCJ0LW9ubGluZS5kZSIpfHxlLkFhKCJnaWdhLmRlIil8fGUuQWEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuamgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSWYpKTt0aGlzLlBkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUGQmJnRoaXMuUGQoKX0sbG86ZnVuY3Rpb24oKXtpZih0aGlzLndmJiZ0aGlzLmZxKCkpe3ZhciBhPXRoaXMuT3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LCRoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMucGR8fAoodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlJnJiYhdGhpcy5TZyYmKHRoaXMuU2c9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlJnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLm9pPSEwKTtjJiZlLldxKCkmJihhLkNnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxqbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMucmQoKXx8KGE9dGhpcy53YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxqdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0sa286ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdi5iaW5kKHRoaXMpLHRoaXMuYnYuYmluZCh0aGlzKSl9LGN2OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMucHAoKX0sYnY6ZnVuY3Rpb24oKXt9LHBwOmZ1bmN0aW9uKCl7ZS5BYyhrLm9wKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5KYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSxKdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHliOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmJrfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaT10aGlzLmFbNV07dGhpcy5rcT10aGlzLmFbM107dGhpcy5DaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbOV07dGhpcy53cT10aGlzLmFbMV07dGhpcy56az10aGlzLmFbM107dGhpcy5BbT10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy5Jdj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5ycj1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTGk6dGhpcy5qcShhKX0sCmpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ2k6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy55ayhhKX0seWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnprOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BbTp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudWo6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMucnJ8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmcuUD90aGlzLmJiPWEuZy5QKCk6dGhpcy5iYj0iIjthLmcuWmcmJmEuZy5aZyh7cGF1c2U6dGhpcy54ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuWHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZzt0aGlzLlZiPXRoaXMuWGM9ITE7dGhpcy5Obj0xRTM7dGhpcy5yYT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlduPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlZjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmCih0aGlzLlZjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5nKSYmdGhpcy5iLmcudSYmKGE9dGhpcy5iLmcudSgpKSx0aGlzLlZjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudWg9dGhpcy5HZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy53bz1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5lZD10aGlzLm9mPXRoaXMuc2I9dGhpcy5tYz0KdGhpcy53aD10aGlzLmtkPXRoaXMuTXU9dGhpcy52Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLnlzPTIwMDt0aGlzLkRmPXRoaXMuRWY9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy53ZD17fX1jLldqPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLiRiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5JZCgiY2FsbCIsdGhpcy5aYSgpKTtlLncoay5UbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxMZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnZiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihnPSEwKTtpZih0aGlzLkwuWSl0aGlzLm1mKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5MLmxvKCksYz1sLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm5oLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5sYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmcuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZy5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5MZShhLGIsZCl9LDUwKX19LFdlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5RZD10aGlzLk9iPXRoaXMua2Q9ITE7dGhpcy5jPWE7dGhpcy5HdCh0aGlzLmMpO3RoaXMud2Q9bmV3IFFhKHRoaXMuYy5ndix0aGlzLnZpZGVvLHt9KTt0aGlzLk5nKGEpO3RoaXMucmM9dGhpcy5FZyhhKTt0aGlzLnFvKCl9LE5nOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkhkPXRoaXMuWnAoYSkpLHRoaXMuTmcoYS5wYXJlbnQpKX0sRWc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZgpifHwoYz10aGlzLkVnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnAoYSkpKTtyZXR1cm4gY30sSnA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuWGQuY29kZT9lLncoay5Cdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLk1lKCksYj09Ri5MZi5jb2RlJiZlLncoay5Tcix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5ucCx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuSWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkpmLmNvZGU6ZS53KGsuZHYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5NZi5jb2RlOmUudyhrLkV2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LllkLmNvZGU6ZS53KGsuSnYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpOwpicmVhaztjYXNlIHcuVWQuY29kZTplLncoay5Ucix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLncoay4kdSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRmYuY29kZTplLncoay5hdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuS2UoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LApHdDpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuWXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5ibiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5YbShiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuSWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuJG0oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuc28oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkV0KCkpOnRoaXMuYy5vcmlnaW4udmcody5VZCl9LEV0OmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnNiPXRoaXMubWM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5uZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMuc2I9ITApO2Uub2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnRhJiZlLmFuKHRoaXMuYy5vcmlnaW4udGEpO2UuZ2IoInNldFVwVnBhaWQiKTt0aGlzLklkKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnhoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuYnEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZWcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnJjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMucHYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5xdigpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9CiEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy51digpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMueXYoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMud3YoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMueHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy56digpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy52digpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5taSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsubWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLlljJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnR2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5jZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5FZiYmCih0aGlzLkRmPSExLHRoaXMuZWMoKSksdGhpcy5zdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMuc2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLnZmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5iZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sc3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubWM9ITF9LHV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHF2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZ2IoImltcHJlc3Npb24iKTt0aGlzLlBoKCk7ZS53KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZ2IoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx3djpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO2UuZ2IoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LHh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmdiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5nYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx2djpmdW5jdGlvbigpe3RoaXMueWYoKTtlLmdiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LG1pOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZ2IoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxwdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmdiKCJlcnIiLGIpO2UudyhrLkF2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5taSghMCl9LFhtOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5yZCgpKXt2YXIgZD1iLndhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubHYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5ObikpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5YYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlhjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC51Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuaHYoKTt0aGlzLmhpKCk7dGhpcy5mZygpO3RoaXMuYi54aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlNmKCl9LFNmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5TZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLlJtLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSxVbTpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjwKYS5sZW5ndGg7ZisrKWM9ZS5JZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLld0KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5SZCYmdGhpcy5VbSh0aGlzLmMuUmQpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5RZHx8KGUudyhrLlZyLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnVifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLlZiPXRoaXMuWGM9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5vZj0KITA7dGhpcy5iLkJlKCk7dGhpcy5hYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudWImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucmgoKTp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxsdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5qbygpO3RoaXMuYy5vcmlnaW4udmcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5NdSl0aGlzLlJhKCk7CmVsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZy5MYSYmIXRoaXMub2YmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmNkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlJ1KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YiwKcGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnViPyh0aGlzLlZiPXRoaXMuWGM9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6CnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy53aHx8KHRoaXMud2g9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFJ1OmZ1bmN0aW9uKGEpe2UudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZiKSx0aGlzLnZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5QaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlVmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLlJmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYKKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmNpPWEpfSxJZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sUGg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHwKdGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMud2QmJnRoaXMud2QudHJhY2smJnRoaXMud2QudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuJHAodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkhkLmltcHJlc3Npb25zJiZlLlVxKGcudXJsLHRoaXMuSGQuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsCmcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5TbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLkZvKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuRWYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5XbShjKSxmfHwoZj10aGlzLnRnKSxlfHwoZT10aGlzLnRnKSx0aGlzLlltKGEpLHRoaXMuTC5LYShiLApmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LHFvOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sWnQ6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sJHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxGbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuanYuYmluZCh0aGlzKSl9LApqdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLncoay5tZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWWMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOgooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuWmMmJihiPXRoaXMuTC5aYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5BYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LApBYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLndvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0KIkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksCmcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk91LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTnUuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkJiKCk7dGhpcy5BYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksCmwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSksCnRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5CYigpO3RoaXMuQWIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy54YSYmKHRoaXMueGEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmJnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsubmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlFlKCkpO3RoaXMuQmIoKX19LEJiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx4ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLlRjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LE91OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFh1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5RYyl8fHRoaXMudWg/KHRoaXMuZWQ9ITAsdGhpcy52YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52YiksdGhpcy52Yj0hMSksdGhpcy5vZygpKToodGhpcy51aD10aGlzLkVmPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZWcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuWnQoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnlzKToodGhpcy5vZj0hMCx0aGlzLmIuQmUoKSx0aGlzLmIuaXQoKSx0aGlzLmFjPSExLGUudyhrLnZvLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy54ZSgpLkdoKCkpfSwKeGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sZmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnhkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuV24rIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSmcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkpnKCkpO3JldHVybiBhfSx0ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuV2p8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLnl1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMubG49YjtiLnByb3RvdHlwZT17RHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkVxOnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55dTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMubG58fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsCm5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5EcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkVhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMucWM9dGhpcy5zYz0hMTt0aGlzLnRhPSIiO3RoaXMuQmY9ITE7dGhpcy5VZz0iIjtkJiZkLmVtcHR5P3RoaXMuRnIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5lbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5oZCgpLGI7Yj1lLndhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTsKYj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC55YShsLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucWcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuSmQoYSkpKyImdHlwZT1qcyIsYj1sLnlhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwueWEobC5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS4kYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuJGJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLiRifHx0aGlzLlpxKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLmp1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LFpxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sRXI6ZnVuY3Rpb24oYSl7dGhpcy5TcyhhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5VZz1hLnJlc3BvbnNlVVJMO3RoaXMuWC5sZW5ndGg/dGhpcy5IYygpOnRoaXMucWEodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLkJmP0YuWGQ6CkYuS2Z9KSl9LEZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5YLmxlbmd0aD90aGlzLkhjKCk6dGhpcy5xYSh0aGlzLlNhKHcuT2Mse2Vycm9yOnRoaXMuQmY/Ri5YZDpGLktmfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5TYSh3LkpmLHtkZXB0aDphfSkpfSxIYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLmFyKCk/dGhpcy50dSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLk9nKCksaCx7QWRTeXN0ZW06dGhpcy5JcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnFhKHRoaXMuU2Eody5NZikpOihhPTAsdGhpcy5ZdSgpJiZ0aGlzLldlKHRoaXMueG8oKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMuc2M/Cih0aGlzLnNjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkhjKCkpOnRoaXMucGFyZW50LlJlKCl9LHJoOmZ1bmN0aW9uKCl7dGhpcy5xYz8odGhpcy5xYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5IYygpKTp0aGlzLnBhcmVudC5yaCgpfSxZdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1KCk/dGhpcy5wdSgpPyEwOigtMSE9dGhpcy5CYygpP3RoaXMucWEodGhpcy5TYSh3LlRkKSk6dGhpcy5xYSh0aGlzLlNhKHcuRmYpKSwhMSk6KHRoaXMucWEodGhpcy5TYSh3Lk9jLEYuTGYpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVWcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5OZSgpKTthLnViPWEudWI/YS51Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5CZzt0aGlzLnBhcmVudC5XZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5CYygpO2EuTz10aGlzLkxnKCk7YS5VYj10aGlzLktwKCk7YS5ndj1bXTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkhwKCk7YS5sZj10aGlzLllwKGEuZHVyYXRpb24pO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYil7dGhpcy50YXx8KHRoaXMudGE9IiIpO2IuJGE9Yi4kYT9iLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHAoKSk6Yi5QYS5jb25jYXQodGhpcy5UcCgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LldiJiZ0aGlzLnBhcmVudC5XYihiKSxhPTAsdGhpcy5IYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGIpLGE9MCl9LFdiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LldiKGEpfSx2ZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx0dTpmdW5jdGlvbigpe3JldHVybiBhPGh9LHF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5MZygpLmxlbmd0aH0scHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkJjKCl9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LFNzOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxhcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2coKS5sZW5ndGh9LE9nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sSXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmJoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5iaChhLnBhcmVudE5vZGUpOiExfSxUcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxMcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCkxnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHp3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxIcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLm5kKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxCYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFlwOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVnQoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuZW18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR209dGhpcy5hWzFdO3RoaXMuVnU9dGhpcy5hWzddO3RoaXMubXQ9dGhpcy5hWzhdO3RoaXMuUHE9dGhpcy5hWzZdO3RoaXMuQ249dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMV19Yy5Sbj1iO2IucHJvdG90eXBlPXtGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMubHQoYSl9LGx0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUHE6CnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dbjp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlJufHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5GbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQT10aGlzLnBjPXRoaXMudWI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5zbD1iO2IucHJvdG90eXBlPXtzbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxScDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRWEpe3ZhciBhPXRoaXMub3JpZ2luLkVhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxKZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5ScCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sYnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLnNsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbNl07dGhpcy55aT10aGlzLmFbOF07dGhpcy5jcj0KdGhpcy5hWzRdO3RoaXMub209dGhpcy5hWzddO3RoaXMubWo9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNV19Yy5Fbz1iO2IucHJvdG90eXBlPXtIbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW06dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Fb3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuSG0oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsCmNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE9hOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LE1mOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSwKSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxadjp7dHlwZToiZXJyb3IiLApjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtLZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxMZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSwkdjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbN107dGhpcy5icD10aGlzLmFbMl07dGhpcy5ucz10aGlzLmFbN107dGhpcy5Taj10aGlzLmFbNF07dGhpcy5BaT10aGlzLmFbNl07dGhpcy55cT10aGlzLmFbMl07dGhpcy5LdD10aGlzLmFbMV07dGhpcy5pcj10aGlzLmFbNV07dGhpcy5JdD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLkVtPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52czp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYnA6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tajp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWk6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlxOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLkt0OnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pcjp0aGlzLkh0KGEpfSxIdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkVtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy51cyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuQ2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DcT10aGlzLmFbNF07CnRoaXMudXE9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzNdfWMuSXM9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNxOnRoaXMudHEoYSl9LHRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51cTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuSXN8fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkJxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLk9kPVtdO3RoaXMuRWg9W107dGhpcy5TZT1bXTt0aGlzLmt2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7CnRoaXMuTSgpfWMuTWs9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtlLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGc9ZS5jb250ZW50V2luZG93O2cuVXc9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuZnQuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuWHMuYmluZCh0aGlzKX07dmFyIGs9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmsub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtnLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7dGhpcy5PZC5wdXNoKHtzcmM6YyxmcmFtZTplLENzOmYsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlNlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuU2VbYl07Yy50eXBlPT09YSYmYy4kbih0aGlzLk1wKGEpKX19LE1wOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e2N4OiEwLGJ4OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e1F3OiJ2aWRlbyIsZXg6ImpzQ3VzdG9tIixmeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxneDoxLEF3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sYXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLk9kLmxlbmd0aDtiKyspaWYodGhpcy5PZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLk9kW2JdLkNzO3JldHVybiIifSxmdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuYXEoYiksdmVuZG9yOmJ9KTsKdGhpcy5YdCgpfSxYczpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMua3YubWFwKGZ1bmN0aW9uKGEpe3RoaXMuY2coYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5jZyhhLGIpfSxjZzpmdW5jdGlvbihhLGIpe3RoaXMuU2UucHVzaCh7dHlwZTphLCRuOmIsJHc6ITF9KX0sWHQ6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLlhxfHwoYS5Udyh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuZHgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLlhxPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO3ZhciBRYT1jLk1rfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kaz10aGlzLmFbMTBdO3RoaXMuTmw9dGhpcy5hWzNdO3RoaXMuTHY9CnRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLnBqPXRoaXMuYVs5XTt0aGlzLmtyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzddfWMuRmk9YjtiLnByb3RvdHlwZT17Wms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRrOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ObDp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTHY6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhrOnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLkZpfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuWmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5nPWE7dGhpcy5qYj1hLkdnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuZGc9ITE7dGhpcy5UYj1bXX1jLm5qPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYsCnk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5pcShhKSxnPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtnPXt4OmIseTpjfTtmJiYoZy5wb3NpdGlvbj1mKTtyZXR1cm4gZ30sYnU6ZnVuY3Rpb24oKXt0aGlzLmRnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0seGg6ZnVuY3Rpb24oKXt0aGlzLmcucGF1c2UoKTtlLncoay5jZCx0aGlzLmcudSgpKX0saXQ6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5nLnBsYXkoKSxlLncoay5kZCx0aGlzLmcudSgpKSl9LGtmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuamIpO3RoaXMuZy5KYyYmdGhpcy5nLkpjKCk/dGhpcy5nLkdnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sCmlxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx4cDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueHAodGhpcy5qYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5nLkpjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5RaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxiZzpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMubmp8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLll2PXRoaXMuYVs2XTt0aGlzLmdwPXRoaXMuYVs2XTt0aGlzLk10PXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLndqPXRoaXMuYVs5XTt0aGlzLndpPXRoaXMuYVs5XTt0aGlzLlNpPXRoaXMuYVs3XTt0aGlzLnpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLkJzPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnY6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLll2OnRoaXMuZnAoYSl9LGZwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncDp0aGlzLkx0KGEpfSxMdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXQ6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJzOgp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLndpOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Cc3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuTXYoNCk7KGZ1bmN0aW9uKGMpe2Muamw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwKKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5EZChiKTt0aGlzLnJnKCl9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxyZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiYKYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5qbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuaWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlZmPXRoaXMuWGY9CnRoaXMuWWc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMudXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWWcmJnRoaXMubGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYWQoKTt0aGlzLllnPSEwO3RoaXMubGcoKX0uYmluZCh0aGlzKSk7CnRoaXMuaGcoKX0sbGc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5hZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5hZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVmYmJiF0aGlzLlhmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0sYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE1nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGhnOmZ1bmN0aW9uKCl7aWYodGhpcy5hZCgpKXt2YXIgYj0KdGhpcy5NZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlhmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVmY9Yi54d310aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLk93KCk6ITF9LEJjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5CYygpOi0xfSxVcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx1cDpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMucygiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCl9LmJpbmQodGhpcyksMTAwKX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlVwKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuaWx8fGRiOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWXE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ud2wuTG0uSm0/d2luZG93Lk9PLndsLkxtLkptLnZ3KGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZcSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMua2x8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jcj10aGlzLmFbNV07dGhpcy5xaz10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbMl07dGhpcy5qPQp0aGlzLmFbOF19Yy5Jaz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXI6dGhpcy5wayhhKX0scGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFrOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuSWt8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkhyKDQpOyhmdW5jdGlvbihjKXtjLmFqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5QZygpfSxQZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7CmJ8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlYoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LApOYTpmdW5jdGlvbigpe3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlcmJigwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLmFqfHxoYjsoZnVuY3Rpb24oYyl7Yy4kaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxpZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnYoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnBhKCk6dGhpcy5tKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5pZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmlnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LERoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwKKGIuRGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudnB8fCh0aGlzLnZwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5EaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuRGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixUPW5ldyBqYihyKTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRW49dGhpcy5hWzVdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuR2s9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsyXTt0aGlzLm1rPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLnlsPXRoaXMuYVs0XTt0aGlzLmV1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuT289YjtiLnByb3RvdHlwZT17RG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVuOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kajp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxqOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHI6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlsOnRoaXMuZHUoYSl9LApkdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmV1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Pb3x8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuRG4oNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSmM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLlVsfHxVOyhmdW5jdGlvbihjKXtjLlRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuVWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnYuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTsKeS5VYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmFzKGEpfS5iaW5kKHRoaXMpKTt5LlVjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuVWMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LmVxKCl9LGFzOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudigpO3RoaXMucGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwKMTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLnYoKTt0aGlzLnBhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5UbHx8VjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy52ZCYmKGI9ZS5HbyhiLHRoaXMudmQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7CnZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmYoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy52ZHx8KHRoaXMudmQ9W10pLHRoaXMudmQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFVjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LHV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuR2N8fAoodGhpcy5HYz1bXSksdGhpcy5HYy5wdXNoKGIpLHRoaXMuaHQoKSYmKHRoaXMuY2YoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sZXE6ZnVuY3Rpb24oKXtpZih0aGlzLkdjKWZvcih2YXIgYj0wO2I8dGhpcy5HYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkdjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPQpiLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkudXUoYil9fSl9KShjKTt2YXIgbGI9Yy5WbHx8bGIseT1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbMl07dGhpcy5rdD10aGlzLmFbNF07dGhpcy5tcj10aGlzLmFbNl07dGhpcy52az10aGlzLmFbMV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5JdT10aGlzLmFbOF07dGhpcy5DdT10aGlzLmFbOF07dGhpcy5Waz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkZxPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ncjp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1yOnRoaXMudWsoYSl9LAp1azpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudms6dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkF1OnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5JdTp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3U6dGhpcy5VayhhKX0sVWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5GcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnYoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpOwphLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuWWl8fG9iOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgbmIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgb2IoZSx0aGlzLkkpKS5mKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9CmIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuWml8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Uaz10aGlzLmFbNl07dGhpcy5Bcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnVyPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ubjp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGo6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vazoKdGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5pOnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Uazp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLnVyfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5tbig0KTsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuV3ModGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sV3M6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWmc6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5Ya3x8c2I7KGZ1bmN0aW9uKGMpe2MuV2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5pPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm5hKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLldrfHx0YjsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5JKSkuZigpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpO3ZhciB1Yj1jLllrfHx1YixXPW5ldyB1YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucnA9dGhpcy5hWzRdO3RoaXMua3A9dGhpcy5hWzNdO3RoaXMuRHA9dGhpcy5hWzddO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuaWo9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuaWp8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnFwKDQpOyhmdW5jdGlvbihjKXtjLmxtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLmxtfHx3YjsoZnVuY3Rpb24oYyl7Yy5rbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sVXM6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE/dGhpcy5Vcyh0aGlzLnphKToodGhpcy56YT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuemEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmCnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5lYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5lYlthXSYmMzAzIT10aGlzLmViW2FdJiY0MDMhPXRoaXMuZWJbYV0mJihiPSExKTtpZihiKXRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLmttfHx4YjsoZnVuY3Rpb24oYyl7Yy5tbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5JKSkuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLm1tfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnE9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuaGs9YjtiLnByb3RvdHlwZT17SXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuaGt8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLklxKDQpOyhmdW5jdGlvbihjKXtjLklsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVihiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuS3MoKX0uYmluZCh0aGlzKSw1MDApfSxLczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFl0OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Lcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Lcj8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWXQoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLkhsfHxDYjsoZnVuY3Rpb24oYyl7Yy5KbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuSmx8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdT10aGlzLmFbMV07dGhpcy5mdj10aGlzLmFbNV07CnRoaXMuZXM9dGhpcy5hWzZdO3RoaXMuTHE9dGhpcy5hWzJdO3RoaXMucW49dGhpcy5hWzEwXTt0aGlzLlFvPXRoaXMuYVs0XTt0aGlzLmxzPXRoaXMuYVs5XTt0aGlzLndtPXRoaXMuYVszXTt0aGlzLmpzPXRoaXMuYVsxMF07dGhpcy5XaT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs2XX1jLmRqPWI7Yi5wcm90b3R5cGU9e0t1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmVzOnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5McTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucW46dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Rbzp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy52bShhKX0sCnZtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53bTp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpzOnRoaXMuVmkoYSl9LFZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuZGp8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLkt1KDQpOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7CnZhciBHYj1jLkRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMudnIoKTp0aGlzLmtnKCk7Yi5hdXRvcGxheSYmCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHRvOmZ1bmN0aW9uKCl7dGhpcy5UZigpfHx0aGlzLm0oITApfSx2cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5vYSYmYi5YJiZiLnV3JiZiLnd3JiYodGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2coKX0uYmluZCh0aGlzKSwxMDApfSxtZDpmdW5jdGlvbigpe2lmKCF0aGlzLnZoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy52aD1iW2NdKTtyZXR1cm4gdGhpcy52aH0sUHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5DbHx8SGI7KGZ1bmN0aW9uKGMpe2MuRWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmYoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLkVsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzFdO3RoaXMuSGk9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs5XTt0aGlzLmVyPXRoaXMuYVsxXTt0aGlzLm1xPXRoaXMuYVs1XTt0aGlzLml1PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMud3A9CmI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5obDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5IaTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3I6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMubHEoYSl9LGxxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tcTp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLndwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5nbCg0KTsKKGZ1bmN0aW9uKGMpe2MuS2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5WKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxOdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxKYzpmdW5jdGlvbigpe3JldHVybiEwfSxJYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuS2t8fFg7KGZ1bmN0aW9uKGMpe2MuSms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLlZ3KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmt8fFk7KGZ1bmN0aW9uKGMpe2MuTGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5mKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5tYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBHLExiPWMuTGt8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuZ3U9dGhpcy5hWzJdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzNdO3RoaXMuV3Y9dGhpcy5hWzEwXTt0aGlzLmZqPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLld1PWI7Yi5wcm90b3R5cGU9e2ZzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nczp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3U6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbzp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmo6dGhpcy5WdihhKX0sVnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLld2OnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuV3V8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLmZzKDQpOyhmdW5jdGlvbihjKXtjLlVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksCmEmJmM/KHRoaXMuVihjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LExhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxTdzpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlVqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Uaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlRqfHxQYjsoZnVuY3Rpb24oYyl7Yy5Waj0KcC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmd2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMoKTtpZihiJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5tYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5mKCkpfX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlZqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Y9dGhpcy5hWzJdO3RoaXMuZm49dGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzhdO3RoaXMueWo9dGhpcy5hWzNdOwp0aGlzLlJzPXRoaXMuYVs4XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs1XX1jLmVrPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hdjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZm46dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLktuOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJzOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmVrfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuQ209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVihhKX1lbHNlIHRoaXMuY2EoKX0sTWQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSwKZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxWczpmdW5jdGlvbigpe3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuU2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlNkfHwodGhpcy5TZD0hMCx0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKTGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLkNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5CbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxaczpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSl9LCRjOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMucygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxQZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPQowO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuJGMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlBmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuWnMod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5QZigpO3RoaXMuWXMoKX0sWXM6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuVHM/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5Ucz0KITB9fSl9KShjKTt2YXIgVWI9Yy5CbXx8VWI7KGZ1bmN0aW9uKGMpe2MuRG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5WcygpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMuRG18fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJHI9dGhpcy5hWzldO3RoaXMuUmw9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOV19Yy5zcT1iO2IucHJvdG90eXBlPXtacjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLiRyOnRoaXMuUWwoYSl9LFFsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuc3F8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLlpyKDQpOyhmdW5jdGlvbihjKXtjLmFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLApiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Rcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnloJiYodGhpcy55aD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMuYW18fE87KGZ1bmN0aW9uKGMpe2MuJGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0semE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5EdCgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuJGx8fFA7KGZ1bmN0aW9uKGMpe2MuYm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLk5rPWI7Yi5wcm90b3R5cGU9e09pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuTmt8fCRiLFhjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLk9pKDQpOyhmdW5jdGlvbihjKXtjLkRrPQp0LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVihhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuQ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmc9MDt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPQp0aGlzLldjPSExO3RoaXMuQ2g9ZS5IYigxMCk7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlZnKys7aWYoMTA8dGhpcy5WZyl0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5tKCEwKTp0aGlzLm0oKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVoLmJpbmQodGhpcyksMTAwKSwhMX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudmEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Da3x8YWE7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgYWM9Yy5Fa3x8YWMsYmM9bmV3IGFjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5CcD10aGlzLmFbMTBdO3RoaXMudHI9dGhpcy5hWzldO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLmJvPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5Qaz10aGlzLmFbN107dGhpcy5Icz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5zaj1iO2IucHJvdG90eXBlPXtBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50cjp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSmk6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xdDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUGs6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2p8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFwKDQpOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7CnZhciBkYz1jLlBqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Paj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qZygpfSxqZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuT2p8fGVjOyhmdW5jdGlvbihjKXtjLlFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsKKG5ldyBlYyhiLHRoaXMuSSkpLmYoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuUWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbj10aGlzLmFbNl07dGhpcy5naz10aGlzLmFbOV07dGhpcy5CbD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbMV07dGhpcy5xcj10aGlzLmFbNV07dGhpcy5Gcz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLlNsPWI7Yi5wcm90b3R5cGU9e2NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kbjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ2s6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJsOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Cbzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLnFyOnRoaXMuRXMoYSl9LEVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuU2x8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmNuKDQpOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5yaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5tZSgpO3RoaXMuZ2coKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSwKZ2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9LG1lOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fApiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMucGl8fGpjOyhmdW5jdGlvbihjKXtjLnNpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMuc2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ycT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmZsPWI7Yi5wcm90b3R5cGU9e3FxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuZmx8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnFxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmdoPXRoaXMuaWg9dGhpcy5oaD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjPwpudWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj8KbnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLnVsPWI7Yi5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuVnAoYSk6W10sYjt0aGlzLmloPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmhoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5naClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYKYSBpbnN0YW5jZW9mIHA/ITA6ITF9LFZwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LCR0OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiB0JiYhdGhpcy5oaClmb3IodGhpcy5naD0hMCxhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnlkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMudWx8fG5jLE09bmV3IG5jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNvPXRoaXMuYVs3XTt0aGlzLlF1PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVs3XTt0aGlzLmhuPQp0aGlzLmFbNl07dGhpcy5TdD10aGlzLmFbMV07dGhpcy5Wbj10aGlzLmFbOV07dGhpcy53dT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLnJvPWI7Yi5wcm90b3R5cGU9e1JvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tbzp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUXU6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5objp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZuOnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5yb3x8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlJvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkFjKGsuWnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkFjKGsuVXIpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsCiIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmphKCk7SS4kZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuamEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLiRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5qYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2UuQWcod2luZG93LEkuTnEoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTsKZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbN107dGhpcy5nbT10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbNV07dGhpcy5Qdj10aGlzLmFbNF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzddO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy56bD1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Sazp0aGlzLk92KGEpfSxPdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHY6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy54cjp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5vOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2w6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy56bHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnpoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy50ZD0wOwp0aGlzLmJiPSIiO3RoaXMuemQ9W107dGhpcy5BZD0wO3RoaXMuQmg9ITE7dGhpcy5aZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXt0aGlzLnpoPWF9LGhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdXQ6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx0dDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxLYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5RcSgpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIudWEsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuS2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLnpjKTtlbHNlIGlmKHRoaXMuZ3EoKSl0aGlzLm90KGZ1bmN0aW9uKCl7dGhpcy5LYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuY2QsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLApnKTtsLnN0KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5KcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkplJiYoYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnRkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudGQuZ2V0VGltZSgpLHRoaXMudGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnRkPWE7cmV0dXJuITF9LFV0OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMud2coYSkpP3RoaXMuS2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5kZCx0aGlzLnBsYXllci51KCkpKX0sVHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuemgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLnp0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLndnKGMpKT90aGlzLktjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5kZCx0aGlzLnBsYXllci51KCkpKX19LHdnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxidDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkZ0KHRoaXMuVHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5vaCl7dGhpcy5vaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5LYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5kZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxhdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnl0KHRoaXMuRmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuT2UoKX0sZjpmdW5jdGlvbigpe3RoaXMuVXQoKTt0aGlzLnBsYXllci5PZSYmdGhpcy5hdCgpO3RoaXMuYnQoKX0sY3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy56ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuVXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkFkPXRoaXMuemQubGVuZ3RofSxncTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5BZCYmKGE9ITApO3JldHVybiBhfSwKb3Q6ZnVuY3Rpb24oYSl7dGhpcy5CaD1hO2ZvcihhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXVsiZnVuY3Rpb24iXSh0aGlzLk9zLmJpbmQodGhpcykpfSxPczpmdW5jdGlvbihhKXt0aGlzLkFkLS07YSYmdGhpcy5aZS5wdXNoKGEpOzA+PXRoaXMuQWQmJnRoaXMuQmgoKX0sSnI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWmUubGVuZ3RoO2MrKyliPXRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUXQ9dGhpcy5hWzZdO3RoaXMucW09dGhpcy5hWzZdO3RoaXMuQXE9dGhpcy5hWzFdO3RoaXMuZXA9dGhpcy5hWzddO3RoaXMuSm89dGhpcy5hWzRdO3RoaXMuT3Q9dGhpcy5hWzVdO3RoaXMuYmw9CnRoaXMuYVs4XTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuUW09YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlF0OnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xbTp0aGlzLnpxKGEpfSx6cTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXE6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kbzp0aGlzLk50KGEpfSxOdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT3Q6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJsOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUW18fHFjLGVkPW5ldyBxYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5QdCg0KX0pLmNhbGwoc2hvaFZvb25waXVOZWFnaSxzaG9oVm9vbnBpdU5lYWdpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.52 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-52.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:45:39 GMT
Via
1.1 89cb19c6f2c9ed0983294d3b12e80e43.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
84
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:47 GMT
Server
AmazonS3
ETag
"063da71572f57793ea4125f50b418f84"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
X-Amz-Cf-Pop
FRA53-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
URGn97MgUK4N2D5gUl-gdYq8qr8PlynhhaTefeCzDqnUceJ2GHAg5g==
Expires
0
pubads_impl_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame A6C7
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
sffe /
Resource Hash
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58568
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:13 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame A6C7
113 B
178 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
/
ssl.1.damoh.giga.de/9c65f967f35c441e8dcbd5675bd3614644a03cfd/ Frame 585E
653 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.giga.de/9c65f967f35c441e8dcbd5675bd3614644a03cfd/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHNob2hWb29ucGl1TmVhZ2k9c2hvaFZvb25waXVOZWFnaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuVWV8fCh5LlVlPTApO3kuVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5abillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5jZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS51dChsKTthLnR0KG0pO2EuY3QoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGE9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5DdCh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzFdO3RoaXMucHM9dGhpcy5hWzRdO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuSHE9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy56bz1iO2IucHJvdG90eXBlPXtZbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmw6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVvOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSHE6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy56b3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWm49ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5vZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLk5zLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5UZz17fTt0aGlzLmVmPSExfWMuWWo9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrCnRoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5UZ1thXSYmKHRoaXMuVGdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5hdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGFuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmCihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxsYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sTnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuTXMoYS5kYXRhKX0sTXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxoZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSwKcWc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMubGgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LElnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFptOmZ1bmN0aW9uKGEsCmIpe2lmKGImJiEoMD50aGlzLndhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuRXAoYSkpcmV0dXJuOyhiPXRoaXMucWcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxFcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx5ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZ2I6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfY2FjaGVfIithLGIsITApfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seWU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxIZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUWg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sCkhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixmLGQ7Zm9yKGY9NzswPD1mO2YtLSlkPWE+Pj40KmYmMTUsaCs9ZC50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHgsdSxyLHA7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgdD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx0LnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IodC5wdXNoKGYpOzE0IT10Lmxlbmd0aCUxNjspdC5wdXNoKDApO3QucHVzaChuPj4+MjkpO3QucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx0Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXRbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eD1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspcD1kKHEsNSkrKG4meHx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9MjA7Mzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTQwOzU5Pj1mO2YrKylwPWQocSw1KSsobiZ4fG4mdXx4JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eCwKeD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NjA7Nzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreCY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxoZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cSkmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxIazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LFBuOmZ1bmN0aW9uKCl7cmV0dXJuIGEuUWkoKXx8YS5jaigpfHxhLm5xKCl8fGEubGwoKXx8YS5ybSgpfHxhLkhrKCl8fGEuUGwoKX19O3JldHVybiBudWxsIT1hLlBuKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sQ2M6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sQWE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sWHA6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEdvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LFZ0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LERnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5kaShiKSsiOiIrdGhpcy5kaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGdmOmZ1bmN0aW9uKGEpe3RoaXMuJGI9YX0sQWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy4kYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKQWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkFnKGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQWMoQil9LFBzOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuWHAoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxXdDpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlBzKGEpO2lmKGIpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5CZCgpO2wueWEoYSwhMCk7YT1sLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuS2EoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLk5jfHwodGhpcy5OYz17fSk7dGhpcy5OY1tmXXx8KHRoaXMuTmNbZl09MCk7dGhpcy5OY1tmXSsrOzEwPHRoaXMuTmNbZl18fChmPQpsLkJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZil7dmFyIGQ9ITE7Zj1mLnJlc3BvbnNlVGV4dDt0cnl7Zj1KU09OLnBhcnNlKGYpLGY9Zi5kYXRhLGZbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGQ9ITApLGZbMV0mJmZbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGQ9ITEpfWNhdGNoKGMpe31kfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZlswXT9mWzBdOiIiKSsoZlsxXT9mWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LApNZTpmdW5jdGlvbigpe2wmJmwuWT9sLmlzRW5hYmxlZCYmbC5rbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxlZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuJHEoYSl8fDA8PQphLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZGYmJndpbmRvdy5zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueWcoYSkpcmV0dXJuIHRoaXMueWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTsKYy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkphLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlptKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIG09ZXx8bDtlPSEwO2smJihlPSExKTtpZihtJiZtLlkpaWYobS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle20ueWEoYSxlKTtlPW0ueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbS5LYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLG0sZyxrKX0uYmluZCh0aGlzKSw1MDApfSxsaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sRHI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMubGgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTGMpZm9yKHZhciBjIGluIHRoaXMuTGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5MY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sbWg6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuSmEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkRyKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkxjPWF9LFV2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxRbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFVxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLllqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlhqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuRHM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLAptZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLlRyPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJ2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5XZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi4kZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlJtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlVmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuZHY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlNyPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9wPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Fdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIiwKbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi52bz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5jZD17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWWY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLlRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5UYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9OwpiLmNlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5TbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iua2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnVkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5uZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuQXY9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9OwpiLiR1PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Vcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbNl07dGhpcy4kbz10aGlzLmFbOF07CnRoaXMubXA9dGhpcy5hWzFdO3RoaXMueW09dGhpcy5hWzNdO3RoaXMuaXA9dGhpcy5hWzhdO3RoaXMuR249dGhpcy5hWzEwXTt0aGlzLnRzPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMuUHI9YjtiLnByb3RvdHlwZT17bnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9yOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubXA6dGhpcy54bShhKX0seG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnltOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pcDp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR246dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5Qcnx8CmphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLm5yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuWmo9YjtiLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxTcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sbGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmxkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMubGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxqYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsKIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamEoKSsiMiJ9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5TcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlpqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkR2PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuWXI9YjtiLnByb3RvdHlwZT17Q3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkR2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuWXJ8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkN2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5qaj1ifSkoYyk7dmFyIEw9Yy5qanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xbz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnlvPWI7Yi5wcm90b3R5cGU9e1ZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlluOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnlvfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Wbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLnRsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5JYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnZ0KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpOjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGNmOmZ1bmN0aW9uKCl7dGhpcy5JYj0KMH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHZ0OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5paCYmTS4kdChiKX0sSHc6ZnVuY3Rpb24oKXtyZXR1cm4gZS55ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LFZxOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy50bHx8cDsoZnVuY3Rpb24oYyl7Yy52bD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPQp0aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5JYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5DYj0iIjt0aGlzLnNnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxJdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LHl0OmZ1bmN0aW9uKGIpe3RoaXMuUGU9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZX0sT2U6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD0KdGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkljKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEdnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGF4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmhxKCl8fHRoaXMuVm0oKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sVm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sCkVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxKZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkNiPWJ9LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2J9LApHaDpmdW5jdGlvbigpe3RoaXMuQ2I9bnVsbH0sTHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkNiJiYoYj0hMCk7cmV0dXJuIGJ9LFd3OmZ1bmN0aW9uKCl7dGhpcy5zZ3x8KHRoaXMuc2c9ITApfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxDdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy52bHx8dDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLk5mPSIxIjt0aGlzLk9mPSIyIjt0aGlzLkttPSIzIjt0aGlzLlBjPTA7dGhpcy5waD0zMDt0aGlzLlJiPVtdO3RoaXMuaGI9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5hZz10aGlzLmdpPQohMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5oZihiKTt0aGlzLnd0KGEpfSxmOmZ1bmN0aW9uKCl7fSxwYTpmdW5jdGlvbigpe3RoaXMuZ2l8fCh0aGlzLmdpPSEwLGUuTWUoKSl9LFRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sTXE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmphKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5qZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuTXEoKTtpZighdGhpcy5TcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5qZigpO3JldHVybn10aGlzLmpmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy4kaCgpO3RoaXMuYWc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMudmEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmhiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSwkaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJgoodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0samY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9mfSxEdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLkttfSxuYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LFRmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSxzdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5PZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUGN9LGhmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnVpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllvPXRoaXMuYVsxXTt0aGlzLkxsPXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLlhsPXRoaXMuYVs2XTt0aGlzLlJ2PXRoaXMuYVs1XTsKdGhpcy5Bbj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLnpqPWI7Yi5wcm90b3R5cGU9e1hvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Zbzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5YbDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnY6dGhpcy56bihhKX0sem46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy56anx8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuWG8oNCk7CihmdW5jdGlvbihjKXtjLkRqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuRGp8fG9hOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLAphPWIudHc7YT9hLm9hP2Eub2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5Fanx8cGE7KGZ1bmN0aW9uKGMpe2MuRmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuRmp8fHFhOyhuZXcgcWEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Mbz10aGlzLmFbNl07CnRoaXMueW49dGhpcy5hWzldO3RoaXMuY3M9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zcD1iO2IucHJvdG90eXBlPXtLbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTG86dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLnNwfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5Lbyg0KTsoZnVuY3Rpb24oYyl7Yy5zaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMueGcoKTt0aGlzLnpnKCk7dGhpcy51bz0hMX0seGc6ZnVuY3Rpb24oKXt0aGlzLmJjPQohMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0semc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpOwphLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5za3x8c2E7KGZ1bmN0aW9uKGMpe2Mucms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMTt0aGlzLmdldFBsYXllcigpOwp2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLndiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy53Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy53Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMud2I9ITApKTp0aGlzLnYoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMucGgmJgohdGhpcy52YSgpJiYodGhpcy53Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudmEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnVvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiYoYS54ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudigib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMudmEoKSYmKHRoaXMud2I/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlNjLmluZGV4T2YoYSkmJgp0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5TYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sR3I6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUWgoYS52aWRlb1RhZyk/YS5iYz90aGlzLnYoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlJjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnhnKCksYS56ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5ya3x8dGE7KGZ1bmN0aW9uKGMpe2MudGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlZxKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmYoKSl9fXRoaXMuVCgpfX0sRXc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5wOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS55YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy50a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzVdfWMudW09YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ObTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudW18fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLk1tKDQpOyhmdW5jdGlvbihjKXtjLmltPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5WKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuaW18fHhhOyhmdW5jdGlvbihjKXtjLmhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPXRoaXMuV2M9ITE7dGhpcy5DaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudGM9dGhpcy5YZz0hMTt0aGlzLlJyKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5zaCgpLHRoaXMuZm8oKSx0aGlzLnJiKCkpfSxScjpmdW5jdGlvbihiKXtyZXR1cm4gZS5BYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwKIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlgsIjsiLHR5cGVvZiBiLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWD9iLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlg/dHlwZW9mIGIuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6CiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KPwp0eXBlb2YgYi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNoKX0semI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJgoodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYj10aGlzLnpiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sS2c6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy56YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxUcTpmdW5jdGlvbigpe2lmKCF0aGlzLldnKXt2YXIgYj0KdGhpcy56YigpLGE9dGhpcy5ScSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuV2c9ITApfXJldHVybiB0aGlzLldnfSxScTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuV2MmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLldjPSEwKTtyZXR1cm4gdGhpcy5XY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuJHMoKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sJHM6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuS2coKTtpZihifHx0aGlzLnZhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0KITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZmEoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxEdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGcmJmIuYWRzJiYodGhpcy5wZz1iLmFkcyk7cmV0dXJuIHRoaXMucGd9LGZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApOwp0aGlzLnMoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLktnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuVHEoKSl7dmFyIGE9dGhpcy56YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnpiKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuemIoKX1lbHNlIHRoaXMuWGc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy56YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6KHRoaXMuZmEoITApLHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSw1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGhvOmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMueWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnljIT1iLmFkcy5zdGF0ZSYmKHRoaXMueWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLnljKXt0aGlzLnYoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMueWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhvKCl9LmJpbmQodGhpcyksMTApfSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxDYTpmdW5jdGlvbigpezA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnZhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sCm9vOmZ1bmN0aW9uKCl7dGhpcy5Nd3x8KDEwPHRoaXMubXY/KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5tdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmd0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9vKCl9LmJpbmQodGhpcyksNTApKSl9LGd0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm52KXt0aGlzLm52PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuaG18fHlhOyhmdW5jdGlvbihjKXtjLmptPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5SaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUmgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUmg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLkljKX19KX0pKGMpO3ZhciB6YT1jLmptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMucHE9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuRnA9YjtiLnByb3RvdHlwZT17QWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FaTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkZwfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuQWooNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxKczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkNiLGg9dGhpcy5rYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7dmFyIENhPWMucWx8fENhOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZWF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIucygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnphKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy50cD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnRwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuSnMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMucGx8fERhOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5tYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLnJsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuZG09dGhpcy5hWzddO3RoaXMuQms9dGhpcy5hWzEwXTt0aGlzLmtuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMubnQ9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG06dGhpcy5BayhhKX0sQWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJrOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT0KYy5udHx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2Mudm4oNCk7KGZ1bmN0aW9uKGMpe2Muams9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuSGcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5Mcz1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0OwpoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkxzKXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuamQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmpkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5qZCl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG5vOmZ1bmN0aW9uKCl7ZS5kaCh0aGlzLmpkKTtlLkZlKHRoaXMuamQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSwKSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmprfHxIYTsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zKCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5pa3x8SWE7KGZ1bmN0aW9uKGMpe2Mua2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuSGcoYiwiZWxlbWVudElEIik7aWYoZS5kaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIEphPWMua2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ebz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLm9sPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMub2x8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkNvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy4kaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT0KYX0seHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLiRqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZmI9YTt0aGlzLkNnPXRoaXMub2k9ITE7dGhpcy50aD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZmI9bmV3IHooYSkpO3ZhciBjPXRoaXMudGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuZmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UueHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmFrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkNnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdHJ5e3RoaXMuU2g/dGhpcy50Yi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMub2l8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy50Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuSWUodGhpcy5mYi51cmwpP2wuTmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5JZSh0aGlzLmZiLnVybCksdGhpcy50aCYmdGhpcy50aCgpfXJldHVybiB0aGlzLnRifX19KShjKTt2YXIgTWE9Yy5ha3x8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPQp0aGlzLldkPSExfWMua2o9YjtiLnByb3RvdHlwZT17QnQ6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxBdDpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGV0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17YXc6IkFkQ2xpY2tUaHJ1IixjdzoiQWRFcnJvciIsZHc6IkFkU3RvcHBlZCIsZ3c6IkFkTGluZWFyQ2hhbmdlIixodzoiQWRUYWdQYXJzZWQiLGx3OiJBZFZpZGVvQ29tcGxldGUiLHB3OiJBZExvYWRlZCIscXc6IkFkU2tpcHBlZCIscnc6IkFkU3RhcnRlZCIsZXc6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdzoiQWRJbXByZXNzaW9uIixidzoiQWRDcmVhdGl2ZVZpZXciLGl3OiJBZFZpZGVvTWlkcG9pbnQiLGt3OiJBZFBhdXNlZCIsCm53OiJBZFZpZGVvU3RhcnQiLG93OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGR0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5WZClmb3IodmFyIGIgaW4gdGhpcy5GYS5WZCl0aGlzLkZhLlZkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5WZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYS5nZXRFcnJvcigpOwphJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuZXQoKTt0aGlzLkZhJiZ0aGlzLmR0KCl9fX0pKGMpO3ZhciBOYT1jLmtqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmplPXRoaXMudmM9dGhpcy54Yj1udWxsO3RoaXMuSG89dGhpcy5KYj10aGlzLmtoPSExO3RoaXMuSmE9IiI7dGhpcy5maD0hMTt0aGlzLnVhPXRoaXMub2Q9IiI7dGhpcy5haD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLkJhPVtdO3RoaXMuUWc9dGhpcy5mYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuS2Q9W107dGhpcy5nYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRGM9ITE7dGhpcy5wbz10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLmxjPXRoaXMudWc9dGhpcy53Zj10aGlzLk5kPXRoaXMubGU9dGhpcy5RYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnBkPTA7dGhpcy5TZz0hMTt0aGlzLlJnPTFFMzt0aGlzLlljPSExO3RoaXMuUWE9MUUzO3RoaXMuUWY9IiJ9Yy5iaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLndjLGFkdGFnbW9kaWZpZXI6dGhpcy54YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMudmMsCmFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5raCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5Ibyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLmZoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLnVhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5haCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5mYyxob21hZEFkcGF0aDp0aGlzLlFnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5JZixIT01BRF9CTE9DS0VEOnRoaXMuR2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMubmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLkhmLHRlc3RIaWRlOnRoaXMuaGMsdGVzdFRhZ3M6dGhpcy5pYyx0ZXN0VGFnc0pTOnRoaXMuamMsCnRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLnBvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubGMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5ZYyxhZEZhbGxiYWNrVVJMOnRoaXMuUWZ9fSxmcTpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYKMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLlFuKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLndhKGEpO2Y/KHRoaXMucmQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuQmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy53Y3x8dGhpcy54Ynx8dGhpcy52Y3x8dGhpcy5qZSkmJihnPXRoaXMuTXIoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5QcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHJkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sUHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIueXc7cmV0dXJuIm5vbmUifSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuS2hdfSxCZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMucWQoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0scWg6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS53YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucWgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLnFoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LE1yOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLnhiKWZvcih2YXIgYiBpbiB0aGlzLnhiKXRoaXMueGIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueGJbYl0pKTt0aGlzLnZjJiYoYT10aGlzLkxyKGEsdGhpcy52YykpO3JldHVybiBhfSxtbzpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5pbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxpbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuQnQoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkF0KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLmZoPSEwO3RoaXMub2Q9YTt0aGlzLnVhPWI7dGhpcy5hZj0KZDt0aGlzLlBkPWY7dGhpcy56Yz1jO3RoaXMuRGE9ZXx8e307dGhpcy5tbygpO3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy5BcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9Yix0aGlzLnhjKCl9Y2F0Y2goayl7dGhpcy5oYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy5vZCt0aGlzLmdlKCJnbG9iYWwiKSksdGhpcy5jcS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiZ2xvYmFsIik7CiJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sQXI6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMudWErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5EYSYmdGhpcy5EYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRGEmJnRoaXMuRGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9CndpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuemM9ITEpO3RoaXMuemMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy56Yz90aGlzLnpjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlk9dGhpcy5haD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5HZikpO3RoaXMuTmIoKTtlLkFjKGsuRHMpOyhiPWUuQ2ModGhpcy5xZCgpKSl8fChiPWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGNxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPQp0aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZmN8fHRoaXMuSmF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy51YX1lbHNlIGE9dGhpcy51YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7CnRoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLlFnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQmEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5mYyYmdGhpcy5KYSYmdGhpcy5CYS5sZW5ndGg/dGhpcy5GYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX0sRmM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5CZCgpKSxkPXRoaXMud2EodGhpcy5mYyk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5mYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5jdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuT2w/dGhpcy5oYSgibm9TVk1Db25maWciKToodGhpcy5PbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuRmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGN1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuRGM9ITA7dGhpcy5GYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuTWIoYi5zdHJpY3QpO3RoaXMud2Y9dGhpcy5NYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy51Zz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5oYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmpjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLndjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMueGI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMudmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmplPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmtoPWIuanNwb3B1cHN8fCExO3RoaXMuSmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMubGM9Yi52cGFpZHx8ITE7dGhpcy5EYS52cGFpZD10aGlzLmxjO3RoaXMuTmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5aYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMubGk9Yi52bWFwc3x8IiI7dGhpcy5ZYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUWE9CmIuYml0cmF0ZXx8MUUzO3RoaXMuUWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuZ2M9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5XcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmdjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuRGM9ITAsdGhpcy5GYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5KdSgpJiYodGhpcy5oY3x8dGhpcy5qY3x8dGhpcy5pY3x8dGhpcy5nY3x8dGhpcy5LZCk/dGhpcy5hZj8odGhpcy5VYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLm5lKCksdGhpcy5OYigpKTp0aGlzLm11KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubnUoKSl9fSwKbXU6ZnVuY3Rpb24oKXt0aGlzLmx1KCk7dGhpcy5vdSgpfSxvdTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmFhKDEwKSxnPWUuYWEoMTApLEg9ZS5hYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS55YihhKGMpKSsKYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5oZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5EYSYmdGhpcy5EYS5wbGF5ZXImJnRoaXMuRGEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7cmV0dXJufXRoaXMuaGEoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG51OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpfSxNYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLlVhPSEwLApkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxsdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmpoKCkpdGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5pYz10aGlzLktkKSYmdGhpcy5pYy5sZW5ndGgpe3ZhciBkPXRoaXMuaWMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5wZigpfSxydTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuS2EobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuc3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmpjJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LHN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0scGY6ZnVuY3Rpb24oKXt0aGlzLmdjPyh0aGlzLnNmKyssdGhpcy5LYShuZXcgeih0aGlzLmdjKSx0aGlzLmt1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuVGgoKX0scWY6ZnVuY3Rpb24oYSl7dGhpcy5NYyh0aGlzLkhmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIisKYSl9LGt1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKTt0aGlzLm5lKCl9LGpoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sTmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVmEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLAphKyIiK2IsITApOyIxIj09PWImJihlLkFhKCJ0LW9ubGluZS5kZSIpfHxlLkFhKCJnaWdhLmRlIil8fGUuQWEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuamgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSWYpKTt0aGlzLlBkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUGQmJnRoaXMuUGQoKX0sbG86ZnVuY3Rpb24oKXtpZih0aGlzLndmJiZ0aGlzLmZxKCkpe3ZhciBhPXRoaXMuT3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LCRoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMucGR8fAoodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlJnJiYhdGhpcy5TZyYmKHRoaXMuU2c9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlJnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLm9pPSEwKTtjJiZlLldxKCkmJihhLkNnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxqbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMucmQoKXx8KGE9dGhpcy53YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxqdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0sa286ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdi5iaW5kKHRoaXMpLHRoaXMuYnYuYmluZCh0aGlzKSl9LGN2OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMucHAoKX0sYnY6ZnVuY3Rpb24oKXt9LHBwOmZ1bmN0aW9uKCl7ZS5BYyhrLm9wKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5KYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSxKdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHliOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmJrfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaT10aGlzLmFbNV07dGhpcy5rcT10aGlzLmFbM107dGhpcy5DaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbOV07dGhpcy53cT10aGlzLmFbMV07dGhpcy56az10aGlzLmFbM107dGhpcy5BbT10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy5Jdj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5ycj1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTGk6dGhpcy5qcShhKX0sCmpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ2k6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy55ayhhKX0seWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnprOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BbTp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudWo6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMucnJ8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmcuUD90aGlzLmJiPWEuZy5QKCk6dGhpcy5iYj0iIjthLmcuWmcmJmEuZy5aZyh7cGF1c2U6dGhpcy54ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuWHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZzt0aGlzLlZiPXRoaXMuWGM9ITE7dGhpcy5Obj0xRTM7dGhpcy5yYT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlduPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlZjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmCih0aGlzLlZjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5nKSYmdGhpcy5iLmcudSYmKGE9dGhpcy5iLmcudSgpKSx0aGlzLlZjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudWg9dGhpcy5HZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy53bz1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5lZD10aGlzLm9mPXRoaXMuc2I9dGhpcy5tYz0KdGhpcy53aD10aGlzLmtkPXRoaXMuTXU9dGhpcy52Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLnlzPTIwMDt0aGlzLkRmPXRoaXMuRWY9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy53ZD17fX1jLldqPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLiRiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5JZCgiY2FsbCIsdGhpcy5aYSgpKTtlLncoay5UbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxMZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnZiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihnPSEwKTtpZih0aGlzLkwuWSl0aGlzLm1mKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5MLmxvKCksYz1sLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm5oLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5sYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmcuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZy5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5MZShhLGIsZCl9LDUwKX19LFdlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5RZD10aGlzLk9iPXRoaXMua2Q9ITE7dGhpcy5jPWE7dGhpcy5HdCh0aGlzLmMpO3RoaXMud2Q9bmV3IFFhKHRoaXMuYy5ndix0aGlzLnZpZGVvLHt9KTt0aGlzLk5nKGEpO3RoaXMucmM9dGhpcy5FZyhhKTt0aGlzLnFvKCl9LE5nOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkhkPXRoaXMuWnAoYSkpLHRoaXMuTmcoYS5wYXJlbnQpKX0sRWc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZgpifHwoYz10aGlzLkVnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnAoYSkpKTtyZXR1cm4gY30sSnA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuWGQuY29kZT9lLncoay5Cdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLk1lKCksYj09Ri5MZi5jb2RlJiZlLncoay5Tcix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5ucCx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuSWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkpmLmNvZGU6ZS53KGsuZHYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5NZi5jb2RlOmUudyhrLkV2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LllkLmNvZGU6ZS53KGsuSnYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpOwpicmVhaztjYXNlIHcuVWQuY29kZTplLncoay5Ucix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLncoay4kdSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRmYuY29kZTplLncoay5hdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuS2UoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LApHdDpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuWXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5ibiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5YbShiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuSWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuJG0oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuc28oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkV0KCkpOnRoaXMuYy5vcmlnaW4udmcody5VZCl9LEV0OmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnNiPXRoaXMubWM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5uZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMuc2I9ITApO2Uub2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnRhJiZlLmFuKHRoaXMuYy5vcmlnaW4udGEpO2UuZ2IoInNldFVwVnBhaWQiKTt0aGlzLklkKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnhoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuYnEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZWcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnJjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMucHYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5xdigpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9CiEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy51digpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMueXYoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMud3YoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMueHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy56digpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy52digpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5taSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsubWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLlljJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnR2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5jZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5FZiYmCih0aGlzLkRmPSExLHRoaXMuZWMoKSksdGhpcy5zdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMuc2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLnZmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5iZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sc3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubWM9ITF9LHV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHF2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZ2IoImltcHJlc3Npb24iKTt0aGlzLlBoKCk7ZS53KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZ2IoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx3djpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO2UuZ2IoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LHh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmdiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5nYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx2djpmdW5jdGlvbigpe3RoaXMueWYoKTtlLmdiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LG1pOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZ2IoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxwdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmdiKCJlcnIiLGIpO2UudyhrLkF2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5taSghMCl9LFhtOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5yZCgpKXt2YXIgZD1iLndhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubHYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5ObikpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5YYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlhjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC51Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuaHYoKTt0aGlzLmhpKCk7dGhpcy5mZygpO3RoaXMuYi54aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlNmKCl9LFNmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5TZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLlJtLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSxVbTpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjwKYS5sZW5ndGg7ZisrKWM9ZS5JZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLld0KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5SZCYmdGhpcy5VbSh0aGlzLmMuUmQpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5RZHx8KGUudyhrLlZyLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnVifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLlZiPXRoaXMuWGM9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5vZj0KITA7dGhpcy5iLkJlKCk7dGhpcy5hYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudWImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucmgoKTp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxsdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5qbygpO3RoaXMuYy5vcmlnaW4udmcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5NdSl0aGlzLlJhKCk7CmVsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZy5MYSYmIXRoaXMub2YmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmNkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlJ1KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YiwKcGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnViPyh0aGlzLlZiPXRoaXMuWGM9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6CnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy53aHx8KHRoaXMud2g9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFJ1OmZ1bmN0aW9uKGEpe2UudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZiKSx0aGlzLnZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5QaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlVmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLlJmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYKKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmNpPWEpfSxJZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sUGg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHwKdGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMud2QmJnRoaXMud2QudHJhY2smJnRoaXMud2QudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuJHAodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkhkLmltcHJlc3Npb25zJiZlLlVxKGcudXJsLHRoaXMuSGQuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsCmcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5TbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLkZvKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuRWYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5XbShjKSxmfHwoZj10aGlzLnRnKSxlfHwoZT10aGlzLnRnKSx0aGlzLlltKGEpLHRoaXMuTC5LYShiLApmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LHFvOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sWnQ6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sJHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxGbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuanYuYmluZCh0aGlzKSl9LApqdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLncoay5tZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWWMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOgooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuWmMmJihiPXRoaXMuTC5aYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5BYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LApBYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLndvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0KIkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksCmcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk91LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTnUuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkJiKCk7dGhpcy5BYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksCmwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSksCnRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5CYigpO3RoaXMuQWIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy54YSYmKHRoaXMueGEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmJnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsubmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlFlKCkpO3RoaXMuQmIoKX19LEJiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx4ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLlRjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LE91OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFh1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5RYyl8fHRoaXMudWg/KHRoaXMuZWQ9ITAsdGhpcy52YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52YiksdGhpcy52Yj0hMSksdGhpcy5vZygpKToodGhpcy51aD10aGlzLkVmPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZWcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuWnQoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnlzKToodGhpcy5vZj0hMCx0aGlzLmIuQmUoKSx0aGlzLmIuaXQoKSx0aGlzLmFjPSExLGUudyhrLnZvLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy54ZSgpLkdoKCkpfSwKeGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sZmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnhkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuV24rIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSmcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkpnKCkpO3JldHVybiBhfSx0ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuV2p8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLnl1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMubG49YjtiLnByb3RvdHlwZT17RHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkVxOnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55dTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMubG58fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsCm5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5EcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkVhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMucWM9dGhpcy5zYz0hMTt0aGlzLnRhPSIiO3RoaXMuQmY9ITE7dGhpcy5VZz0iIjtkJiZkLmVtcHR5P3RoaXMuRnIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5lbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5oZCgpLGI7Yj1lLndhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTsKYj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC55YShsLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucWcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuSmQoYSkpKyImdHlwZT1qcyIsYj1sLnlhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwueWEobC5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS4kYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuJGJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLiRifHx0aGlzLlpxKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLmp1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LFpxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sRXI6ZnVuY3Rpb24oYSl7dGhpcy5TcyhhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5VZz1hLnJlc3BvbnNlVVJMO3RoaXMuWC5sZW5ndGg/dGhpcy5IYygpOnRoaXMucWEodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLkJmP0YuWGQ6CkYuS2Z9KSl9LEZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5YLmxlbmd0aD90aGlzLkhjKCk6dGhpcy5xYSh0aGlzLlNhKHcuT2Mse2Vycm9yOnRoaXMuQmY/Ri5YZDpGLktmfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5TYSh3LkpmLHtkZXB0aDphfSkpfSxIYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLmFyKCk/dGhpcy50dSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLk9nKCksaCx7QWRTeXN0ZW06dGhpcy5JcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnFhKHRoaXMuU2Eody5NZikpOihhPTAsdGhpcy5ZdSgpJiZ0aGlzLldlKHRoaXMueG8oKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMuc2M/Cih0aGlzLnNjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkhjKCkpOnRoaXMucGFyZW50LlJlKCl9LHJoOmZ1bmN0aW9uKCl7dGhpcy5xYz8odGhpcy5xYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5IYygpKTp0aGlzLnBhcmVudC5yaCgpfSxZdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1KCk/dGhpcy5wdSgpPyEwOigtMSE9dGhpcy5CYygpP3RoaXMucWEodGhpcy5TYSh3LlRkKSk6dGhpcy5xYSh0aGlzLlNhKHcuRmYpKSwhMSk6KHRoaXMucWEodGhpcy5TYSh3Lk9jLEYuTGYpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVWcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5OZSgpKTthLnViPWEudWI/YS51Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5CZzt0aGlzLnBhcmVudC5XZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5CYygpO2EuTz10aGlzLkxnKCk7YS5VYj10aGlzLktwKCk7YS5ndj1bXTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkhwKCk7YS5sZj10aGlzLllwKGEuZHVyYXRpb24pO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYil7dGhpcy50YXx8KHRoaXMudGE9IiIpO2IuJGE9Yi4kYT9iLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHAoKSk6Yi5QYS5jb25jYXQodGhpcy5UcCgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LldiJiZ0aGlzLnBhcmVudC5XYihiKSxhPTAsdGhpcy5IYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGIpLGE9MCl9LFdiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LldiKGEpfSx2ZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx0dTpmdW5jdGlvbigpe3JldHVybiBhPGh9LHF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5MZygpLmxlbmd0aH0scHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkJjKCl9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LFNzOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxhcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2coKS5sZW5ndGh9LE9nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sSXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmJoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5iaChhLnBhcmVudE5vZGUpOiExfSxUcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxMcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCkxnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHp3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxIcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLm5kKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxCYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFlwOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVnQoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuZW18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR209dGhpcy5hWzFdO3RoaXMuVnU9dGhpcy5hWzddO3RoaXMubXQ9dGhpcy5hWzhdO3RoaXMuUHE9dGhpcy5hWzZdO3RoaXMuQ249dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMV19Yy5Sbj1iO2IucHJvdG90eXBlPXtGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMubHQoYSl9LGx0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUHE6CnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dbjp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlJufHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5GbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQT10aGlzLnBjPXRoaXMudWI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5zbD1iO2IucHJvdG90eXBlPXtzbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxScDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRWEpe3ZhciBhPXRoaXMub3JpZ2luLkVhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxKZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5ScCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sYnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLnNsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbNl07dGhpcy55aT10aGlzLmFbOF07dGhpcy5jcj0KdGhpcy5hWzRdO3RoaXMub209dGhpcy5hWzddO3RoaXMubWo9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNV19Yy5Fbz1iO2IucHJvdG90eXBlPXtIbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW06dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Fb3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuSG0oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsCmNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE9hOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LE1mOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSwKSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxadjp7dHlwZToiZXJyb3IiLApjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtLZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxMZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSwkdjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbN107dGhpcy5icD10aGlzLmFbMl07dGhpcy5ucz10aGlzLmFbN107dGhpcy5Taj10aGlzLmFbNF07dGhpcy5BaT10aGlzLmFbNl07dGhpcy55cT10aGlzLmFbMl07dGhpcy5LdD10aGlzLmFbMV07dGhpcy5pcj10aGlzLmFbNV07dGhpcy5JdD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLkVtPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52czp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYnA6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tajp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWk6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlxOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLkt0OnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pcjp0aGlzLkh0KGEpfSxIdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkVtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy51cyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuQ2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DcT10aGlzLmFbNF07CnRoaXMudXE9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzNdfWMuSXM9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNxOnRoaXMudHEoYSl9LHRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51cTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuSXN8fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkJxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLk9kPVtdO3RoaXMuRWg9W107dGhpcy5TZT1bXTt0aGlzLmt2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7CnRoaXMuTSgpfWMuTWs9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtlLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGc9ZS5jb250ZW50V2luZG93O2cuVXc9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuZnQuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuWHMuYmluZCh0aGlzKX07dmFyIGs9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmsub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtnLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7dGhpcy5PZC5wdXNoKHtzcmM6YyxmcmFtZTplLENzOmYsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlNlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuU2VbYl07Yy50eXBlPT09YSYmYy4kbih0aGlzLk1wKGEpKX19LE1wOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e2N4OiEwLGJ4OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e1F3OiJ2aWRlbyIsZXg6ImpzQ3VzdG9tIixmeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxneDoxLEF3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sYXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLk9kLmxlbmd0aDtiKyspaWYodGhpcy5PZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLk9kW2JdLkNzO3JldHVybiIifSxmdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuYXEoYiksdmVuZG9yOmJ9KTsKdGhpcy5YdCgpfSxYczpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMua3YubWFwKGZ1bmN0aW9uKGEpe3RoaXMuY2coYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5jZyhhLGIpfSxjZzpmdW5jdGlvbihhLGIpe3RoaXMuU2UucHVzaCh7dHlwZTphLCRuOmIsJHc6ITF9KX0sWHQ6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLlhxfHwoYS5Udyh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuZHgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLlhxPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO3ZhciBRYT1jLk1rfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kaz10aGlzLmFbMTBdO3RoaXMuTmw9dGhpcy5hWzNdO3RoaXMuTHY9CnRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLnBqPXRoaXMuYVs5XTt0aGlzLmtyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzddfWMuRmk9YjtiLnByb3RvdHlwZT17Wms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRrOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ObDp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTHY6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhrOnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLkZpfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuWmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5nPWE7dGhpcy5qYj1hLkdnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuZGc9ITE7dGhpcy5UYj1bXX1jLm5qPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYsCnk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5pcShhKSxnPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtnPXt4OmIseTpjfTtmJiYoZy5wb3NpdGlvbj1mKTtyZXR1cm4gZ30sYnU6ZnVuY3Rpb24oKXt0aGlzLmRnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0seGg6ZnVuY3Rpb24oKXt0aGlzLmcucGF1c2UoKTtlLncoay5jZCx0aGlzLmcudSgpKX0saXQ6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5nLnBsYXkoKSxlLncoay5kZCx0aGlzLmcudSgpKSl9LGtmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuamIpO3RoaXMuZy5KYyYmdGhpcy5nLkpjKCk/dGhpcy5nLkdnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sCmlxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx4cDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueHAodGhpcy5qYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5nLkpjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5RaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxiZzpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMubmp8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLll2PXRoaXMuYVs2XTt0aGlzLmdwPXRoaXMuYVs2XTt0aGlzLk10PXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLndqPXRoaXMuYVs5XTt0aGlzLndpPXRoaXMuYVs5XTt0aGlzLlNpPXRoaXMuYVs3XTt0aGlzLnpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLkJzPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnY6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLll2OnRoaXMuZnAoYSl9LGZwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncDp0aGlzLkx0KGEpfSxMdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXQ6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJzOgp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLndpOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Cc3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuTXYoNCk7KGZ1bmN0aW9uKGMpe2Muamw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwKKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5EZChiKTt0aGlzLnJnKCl9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxyZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiYKYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5qbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuaWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlZmPXRoaXMuWGY9CnRoaXMuWWc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMudXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWWcmJnRoaXMubGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYWQoKTt0aGlzLllnPSEwO3RoaXMubGcoKX0uYmluZCh0aGlzKSk7CnRoaXMuaGcoKX0sbGc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5hZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5hZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVmYmJiF0aGlzLlhmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0sYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE1nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGhnOmZ1bmN0aW9uKCl7aWYodGhpcy5hZCgpKXt2YXIgYj0KdGhpcy5NZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlhmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVmY9Yi54d310aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLk93KCk6ITF9LEJjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5CYygpOi0xfSxVcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx1cDpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMucygiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCl9LmJpbmQodGhpcyksMTAwKX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlVwKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuaWx8fGRiOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWXE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ud2wuTG0uSm0/d2luZG93Lk9PLndsLkxtLkptLnZ3KGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZcSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMua2x8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jcj10aGlzLmFbNV07dGhpcy5xaz10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbMl07dGhpcy5qPQp0aGlzLmFbOF19Yy5Jaz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXI6dGhpcy5wayhhKX0scGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFrOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuSWt8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkhyKDQpOyhmdW5jdGlvbihjKXtjLmFqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5QZygpfSxQZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7CmJ8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlYoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LApOYTpmdW5jdGlvbigpe3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlcmJigwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLmFqfHxoYjsoZnVuY3Rpb24oYyl7Yy4kaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxpZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnYoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnBhKCk6dGhpcy5tKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5pZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmlnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LERoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwKKGIuRGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudnB8fCh0aGlzLnZwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5EaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuRGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixUPW5ldyBqYihyKTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRW49dGhpcy5hWzVdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuR2s9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsyXTt0aGlzLm1rPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLnlsPXRoaXMuYVs0XTt0aGlzLmV1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuT289YjtiLnByb3RvdHlwZT17RG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVuOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kajp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxqOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHI6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlsOnRoaXMuZHUoYSl9LApkdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmV1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Pb3x8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuRG4oNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSmM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLlVsfHxVOyhmdW5jdGlvbihjKXtjLlRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuVWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnYuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTsKeS5VYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmFzKGEpfS5iaW5kKHRoaXMpKTt5LlVjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuVWMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LmVxKCl9LGFzOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudigpO3RoaXMucGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwKMTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLnYoKTt0aGlzLnBhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5UbHx8VjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy52ZCYmKGI9ZS5HbyhiLHRoaXMudmQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7CnZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmYoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy52ZHx8KHRoaXMudmQ9W10pLHRoaXMudmQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFVjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LHV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuR2N8fAoodGhpcy5HYz1bXSksdGhpcy5HYy5wdXNoKGIpLHRoaXMuaHQoKSYmKHRoaXMuY2YoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sZXE6ZnVuY3Rpb24oKXtpZih0aGlzLkdjKWZvcih2YXIgYj0wO2I8dGhpcy5HYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkdjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPQpiLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkudXUoYil9fSl9KShjKTt2YXIgbGI9Yy5WbHx8bGIseT1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbMl07dGhpcy5rdD10aGlzLmFbNF07dGhpcy5tcj10aGlzLmFbNl07dGhpcy52az10aGlzLmFbMV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5JdT10aGlzLmFbOF07dGhpcy5DdT10aGlzLmFbOF07dGhpcy5Waz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkZxPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ncjp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1yOnRoaXMudWsoYSl9LAp1azpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudms6dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkF1OnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5JdTp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3U6dGhpcy5VayhhKX0sVWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5GcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnYoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpOwphLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuWWl8fG9iOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgbmIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgb2IoZSx0aGlzLkkpKS5mKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9CmIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuWml8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Uaz10aGlzLmFbNl07dGhpcy5Bcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnVyPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ubjp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGo6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vazoKdGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5pOnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Uazp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLnVyfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5tbig0KTsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuV3ModGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sV3M6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWmc6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5Ya3x8c2I7KGZ1bmN0aW9uKGMpe2MuV2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5pPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm5hKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLldrfHx0YjsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5JKSkuZigpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpO3ZhciB1Yj1jLllrfHx1YixXPW5ldyB1YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucnA9dGhpcy5hWzRdO3RoaXMua3A9dGhpcy5hWzNdO3RoaXMuRHA9dGhpcy5hWzddO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuaWo9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuaWp8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnFwKDQpOyhmdW5jdGlvbihjKXtjLmxtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLmxtfHx3YjsoZnVuY3Rpb24oYyl7Yy5rbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sVXM6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE/dGhpcy5Vcyh0aGlzLnphKToodGhpcy56YT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuemEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmCnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5lYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5lYlthXSYmMzAzIT10aGlzLmViW2FdJiY0MDMhPXRoaXMuZWJbYV0mJihiPSExKTtpZihiKXRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLmttfHx4YjsoZnVuY3Rpb24oYyl7Yy5tbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5JKSkuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLm1tfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnE9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuaGs9YjtiLnByb3RvdHlwZT17SXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuaGt8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLklxKDQpOyhmdW5jdGlvbihjKXtjLklsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVihiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuS3MoKX0uYmluZCh0aGlzKSw1MDApfSxLczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFl0OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Lcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Lcj8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWXQoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLkhsfHxDYjsoZnVuY3Rpb24oYyl7Yy5KbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuSmx8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdT10aGlzLmFbMV07dGhpcy5mdj10aGlzLmFbNV07CnRoaXMuZXM9dGhpcy5hWzZdO3RoaXMuTHE9dGhpcy5hWzJdO3RoaXMucW49dGhpcy5hWzEwXTt0aGlzLlFvPXRoaXMuYVs0XTt0aGlzLmxzPXRoaXMuYVs5XTt0aGlzLndtPXRoaXMuYVszXTt0aGlzLmpzPXRoaXMuYVsxMF07dGhpcy5XaT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs2XX1jLmRqPWI7Yi5wcm90b3R5cGU9e0t1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmVzOnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5McTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucW46dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Rbzp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy52bShhKX0sCnZtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53bTp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpzOnRoaXMuVmkoYSl9LFZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuZGp8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLkt1KDQpOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7CnZhciBHYj1jLkRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMudnIoKTp0aGlzLmtnKCk7Yi5hdXRvcGxheSYmCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHRvOmZ1bmN0aW9uKCl7dGhpcy5UZigpfHx0aGlzLm0oITApfSx2cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5vYSYmYi5YJiZiLnV3JiZiLnd3JiYodGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2coKX0uYmluZCh0aGlzKSwxMDApfSxtZDpmdW5jdGlvbigpe2lmKCF0aGlzLnZoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy52aD1iW2NdKTtyZXR1cm4gdGhpcy52aH0sUHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5DbHx8SGI7KGZ1bmN0aW9uKGMpe2MuRWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmYoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLkVsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzFdO3RoaXMuSGk9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs5XTt0aGlzLmVyPXRoaXMuYVsxXTt0aGlzLm1xPXRoaXMuYVs1XTt0aGlzLml1PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMud3A9CmI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5obDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5IaTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3I6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMubHEoYSl9LGxxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tcTp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLndwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5nbCg0KTsKKGZ1bmN0aW9uKGMpe2MuS2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5WKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxOdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxKYzpmdW5jdGlvbigpe3JldHVybiEwfSxJYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuS2t8fFg7KGZ1bmN0aW9uKGMpe2MuSms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLlZ3KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmt8fFk7KGZ1bmN0aW9uKGMpe2MuTGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5mKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5tYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBHLExiPWMuTGt8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuZ3U9dGhpcy5hWzJdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzNdO3RoaXMuV3Y9dGhpcy5hWzEwXTt0aGlzLmZqPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLld1PWI7Yi5wcm90b3R5cGU9e2ZzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nczp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3U6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbzp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmo6dGhpcy5WdihhKX0sVnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLld2OnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuV3V8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLmZzKDQpOyhmdW5jdGlvbihjKXtjLlVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksCmEmJmM/KHRoaXMuVihjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LExhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxTdzpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlVqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Uaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlRqfHxQYjsoZnVuY3Rpb24oYyl7Yy5Waj0KcC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmd2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMoKTtpZihiJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5tYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5mKCkpfX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlZqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Y9dGhpcy5hWzJdO3RoaXMuZm49dGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzhdO3RoaXMueWo9dGhpcy5hWzNdOwp0aGlzLlJzPXRoaXMuYVs4XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs1XX1jLmVrPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hdjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZm46dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLktuOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJzOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmVrfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuQ209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVihhKX1lbHNlIHRoaXMuY2EoKX0sTWQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSwKZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxWczpmdW5jdGlvbigpe3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuU2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlNkfHwodGhpcy5TZD0hMCx0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKTGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLkNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5CbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxaczpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSl9LCRjOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMucygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxQZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPQowO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuJGMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlBmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuWnMod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5QZigpO3RoaXMuWXMoKX0sWXM6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuVHM/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5Ucz0KITB9fSl9KShjKTt2YXIgVWI9Yy5CbXx8VWI7KGZ1bmN0aW9uKGMpe2MuRG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5WcygpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMuRG18fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJHI9dGhpcy5hWzldO3RoaXMuUmw9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOV19Yy5zcT1iO2IucHJvdG90eXBlPXtacjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLiRyOnRoaXMuUWwoYSl9LFFsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuc3F8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLlpyKDQpOyhmdW5jdGlvbihjKXtjLmFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLApiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Rcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnloJiYodGhpcy55aD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMuYW18fE87KGZ1bmN0aW9uKGMpe2MuJGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0semE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5EdCgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuJGx8fFA7KGZ1bmN0aW9uKGMpe2MuYm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLk5rPWI7Yi5wcm90b3R5cGU9e09pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuTmt8fCRiLFhjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLk9pKDQpOyhmdW5jdGlvbihjKXtjLkRrPQp0LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVihhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuQ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmc9MDt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPQp0aGlzLldjPSExO3RoaXMuQ2g9ZS5IYigxMCk7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlZnKys7aWYoMTA8dGhpcy5WZyl0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5tKCEwKTp0aGlzLm0oKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVoLmJpbmQodGhpcyksMTAwKSwhMX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudmEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Da3x8YWE7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgYWM9Yy5Fa3x8YWMsYmM9bmV3IGFjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5CcD10aGlzLmFbMTBdO3RoaXMudHI9dGhpcy5hWzldO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLmJvPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5Qaz10aGlzLmFbN107dGhpcy5Icz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5zaj1iO2IucHJvdG90eXBlPXtBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50cjp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSmk6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xdDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUGs6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2p8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFwKDQpOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7CnZhciBkYz1jLlBqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Paj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qZygpfSxqZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuT2p8fGVjOyhmdW5jdGlvbihjKXtjLlFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsKKG5ldyBlYyhiLHRoaXMuSSkpLmYoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuUWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbj10aGlzLmFbNl07dGhpcy5naz10aGlzLmFbOV07dGhpcy5CbD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbMV07dGhpcy5xcj10aGlzLmFbNV07dGhpcy5Gcz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLlNsPWI7Yi5wcm90b3R5cGU9e2NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kbjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ2s6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJsOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Cbzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLnFyOnRoaXMuRXMoYSl9LEVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuU2x8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmNuKDQpOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5yaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5tZSgpO3RoaXMuZ2coKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSwKZ2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9LG1lOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fApiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMucGl8fGpjOyhmdW5jdGlvbihjKXtjLnNpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMuc2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ycT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmZsPWI7Yi5wcm90b3R5cGU9e3FxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuZmx8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnFxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmdoPXRoaXMuaWg9dGhpcy5oaD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjPwpudWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj8KbnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLnVsPWI7Yi5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuVnAoYSk6W10sYjt0aGlzLmloPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmhoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5naClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYKYSBpbnN0YW5jZW9mIHA/ITA6ITF9LFZwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LCR0OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiB0JiYhdGhpcy5oaClmb3IodGhpcy5naD0hMCxhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnlkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMudWx8fG5jLE09bmV3IG5jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNvPXRoaXMuYVs3XTt0aGlzLlF1PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVs3XTt0aGlzLmhuPQp0aGlzLmFbNl07dGhpcy5TdD10aGlzLmFbMV07dGhpcy5Wbj10aGlzLmFbOV07dGhpcy53dT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLnJvPWI7Yi5wcm90b3R5cGU9e1JvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tbzp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUXU6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5objp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZuOnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5yb3x8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlJvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkFjKGsuWnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkFjKGsuVXIpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsCiIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmphKCk7SS4kZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuamEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLiRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5qYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2UuQWcod2luZG93LEkuTnEoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTsKZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbN107dGhpcy5nbT10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbNV07dGhpcy5Qdj10aGlzLmFbNF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzddO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy56bD1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Sazp0aGlzLk92KGEpfSxPdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHY6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy54cjp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5vOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2w6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy56bHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnpoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy50ZD0wOwp0aGlzLmJiPSIiO3RoaXMuemQ9W107dGhpcy5BZD0wO3RoaXMuQmg9ITE7dGhpcy5aZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXt0aGlzLnpoPWF9LGhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdXQ6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx0dDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxLYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5RcSgpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIudWEsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuS2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLnpjKTtlbHNlIGlmKHRoaXMuZ3EoKSl0aGlzLm90KGZ1bmN0aW9uKCl7dGhpcy5LYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuY2QsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLApnKTtsLnN0KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5KcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkplJiYoYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnRkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudGQuZ2V0VGltZSgpLHRoaXMudGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnRkPWE7cmV0dXJuITF9LFV0OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMud2coYSkpP3RoaXMuS2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5kZCx0aGlzLnBsYXllci51KCkpKX0sVHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuemgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLnp0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLndnKGMpKT90aGlzLktjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5kZCx0aGlzLnBsYXllci51KCkpKX19LHdnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxidDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkZ0KHRoaXMuVHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5vaCl7dGhpcy5vaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5LYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5kZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxhdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnl0KHRoaXMuRmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuT2UoKX0sZjpmdW5jdGlvbigpe3RoaXMuVXQoKTt0aGlzLnBsYXllci5PZSYmdGhpcy5hdCgpO3RoaXMuYnQoKX0sY3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy56ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuVXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkFkPXRoaXMuemQubGVuZ3RofSxncTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5BZCYmKGE9ITApO3JldHVybiBhfSwKb3Q6ZnVuY3Rpb24oYSl7dGhpcy5CaD1hO2ZvcihhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXVsiZnVuY3Rpb24iXSh0aGlzLk9zLmJpbmQodGhpcykpfSxPczpmdW5jdGlvbihhKXt0aGlzLkFkLS07YSYmdGhpcy5aZS5wdXNoKGEpOzA+PXRoaXMuQWQmJnRoaXMuQmgoKX0sSnI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWmUubGVuZ3RoO2MrKyliPXRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUXQ9dGhpcy5hWzZdO3RoaXMucW09dGhpcy5hWzZdO3RoaXMuQXE9dGhpcy5hWzFdO3RoaXMuZXA9dGhpcy5hWzddO3RoaXMuSm89dGhpcy5hWzRdO3RoaXMuT3Q9dGhpcy5hWzVdO3RoaXMuYmw9CnRoaXMuYVs4XTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuUW09YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlF0OnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xbTp0aGlzLnpxKGEpfSx6cTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXE6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kbzp0aGlzLk50KGEpfSxOdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT3Q6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJsOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUW18fHFjLGVkPW5ldyBxYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5QdCg0KX0pLmNhbGwoc2hvaFZvb25waXVOZWFnaSxzaG9oVm9vbnBpdU5lYWdpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.9.6 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.6.9.76.144.clients.your-server.de
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sun, 29 Sep 2019 01:46:13 GMT
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:24 GMT
Server
AmazonS3
Etag
"063da71572f57793ea4125f50b418f84"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de34-homad-2
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.giga.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
ads
securepubads.g.doubleclick.net/gampad/ Frame A6C7
19 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2348261355020110&correlator=329956000913246&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21061864%2C21063203%2C21064550&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190929&iu=%2F5286166%2Fgiga.de%2FDFP-Passback-300x250&sz=300x250&eri=6&cookie=ID%3Df1123aae24ba9604%3AT%3D1569721572%3AS%3DALNI_MZUkAHrcj90o51UHLQKoB8uDjtMVA&cdm=www.giga.de&bc=31&lmt=1569721573&dt=1569721573470&dlt=1569721573391&idt=74&ea=0&frm=23&biw=1585&bih=1200&isw=300&ish=250&oid=3&adx=968&ady=278&adk=3816689529&uci=a3n3rzsgn2cr&ifi=1&ifk=1431988673&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=409114290.1569721572&ga_sid=1569721573&ga_hid=600289930&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
cafe /
Resource Hash
60344566cd7a660f64f04524830eed95e6e8306dd1bc974d1bf3367acc081d6a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
7840
x-xss-protection
0
google-lineitem-id
5021576057
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266369035
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019091901.js
securepubads.g.doubleclick.net/gpt/ Frame A6C7
62 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.210.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s07-in-f2.1e100.net
Software
sffe /
Resource Hash
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24151
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:13 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame A6C7
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

truncated
/ Frame A6C7
211 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
fba1138742fc760a1fe93792509bf9cf11763ecfd194219e9d35896a480757c0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
hic_qos
ssl.1.damoh.giga.de/ Frame 585E
24 B
409 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHNob2hWb29ucGl1TmVhZ2k9c2hvaFZvb25waXVOZWFnaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuVWV8fCh5LlVlPTApO3kuVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5abillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5jZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS51dChsKTthLnR0KG0pO2EuY3QoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGE9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5DdCh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzFdO3RoaXMucHM9dGhpcy5hWzRdO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuSHE9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy56bz1iO2IucHJvdG90eXBlPXtZbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmw6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVvOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSHE6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy56b3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWm49ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5vZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLk5zLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5UZz17fTt0aGlzLmVmPSExfWMuWWo9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrCnRoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5UZ1thXSYmKHRoaXMuVGdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5hdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGFuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmCihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxsYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sTnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuTXMoYS5kYXRhKX0sTXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxoZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSwKcWc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMubGgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LElnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFptOmZ1bmN0aW9uKGEsCmIpe2lmKGImJiEoMD50aGlzLndhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuRXAoYSkpcmV0dXJuOyhiPXRoaXMucWcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxFcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx5ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZ2I6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfY2FjaGVfIithLGIsITApfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seWU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxIZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUWg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sCkhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixmLGQ7Zm9yKGY9NzswPD1mO2YtLSlkPWE+Pj40KmYmMTUsaCs9ZC50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHgsdSxyLHA7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgdD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx0LnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IodC5wdXNoKGYpOzE0IT10Lmxlbmd0aCUxNjspdC5wdXNoKDApO3QucHVzaChuPj4+MjkpO3QucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx0Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXRbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eD1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspcD1kKHEsNSkrKG4meHx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9MjA7Mzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTQwOzU5Pj1mO2YrKylwPWQocSw1KSsobiZ4fG4mdXx4JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eCwKeD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NjA7Nzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreCY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxoZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cSkmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxIazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LFBuOmZ1bmN0aW9uKCl7cmV0dXJuIGEuUWkoKXx8YS5jaigpfHxhLm5xKCl8fGEubGwoKXx8YS5ybSgpfHxhLkhrKCl8fGEuUGwoKX19O3JldHVybiBudWxsIT1hLlBuKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sQ2M6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sQWE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sWHA6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEdvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LFZ0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LERnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5kaShiKSsiOiIrdGhpcy5kaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGdmOmZ1bmN0aW9uKGEpe3RoaXMuJGI9YX0sQWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy4kYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKQWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkFnKGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQWMoQil9LFBzOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuWHAoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxXdDpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlBzKGEpO2lmKGIpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5CZCgpO2wueWEoYSwhMCk7YT1sLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuS2EoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLk5jfHwodGhpcy5OYz17fSk7dGhpcy5OY1tmXXx8KHRoaXMuTmNbZl09MCk7dGhpcy5OY1tmXSsrOzEwPHRoaXMuTmNbZl18fChmPQpsLkJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZil7dmFyIGQ9ITE7Zj1mLnJlc3BvbnNlVGV4dDt0cnl7Zj1KU09OLnBhcnNlKGYpLGY9Zi5kYXRhLGZbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGQ9ITApLGZbMV0mJmZbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGQ9ITEpfWNhdGNoKGMpe31kfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZlswXT9mWzBdOiIiKSsoZlsxXT9mWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LApNZTpmdW5jdGlvbigpe2wmJmwuWT9sLmlzRW5hYmxlZCYmbC5rbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxlZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuJHEoYSl8fDA8PQphLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZGYmJndpbmRvdy5zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueWcoYSkpcmV0dXJuIHRoaXMueWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTsKYy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkphLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlptKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIG09ZXx8bDtlPSEwO2smJihlPSExKTtpZihtJiZtLlkpaWYobS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle20ueWEoYSxlKTtlPW0ueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbS5LYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLG0sZyxrKX0uYmluZCh0aGlzKSw1MDApfSxsaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sRHI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMubGgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTGMpZm9yKHZhciBjIGluIHRoaXMuTGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5MY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sbWg6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuSmEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkRyKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkxjPWF9LFV2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxRbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFVxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLllqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlhqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuRHM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLAptZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLlRyPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJ2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5XZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi4kZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlJtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlVmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuZHY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlNyPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9wPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Fdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIiwKbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi52bz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5jZD17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWWY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLlRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5UYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9OwpiLmNlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5TbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iua2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnVkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5uZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuQXY9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9OwpiLiR1PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Vcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbNl07dGhpcy4kbz10aGlzLmFbOF07CnRoaXMubXA9dGhpcy5hWzFdO3RoaXMueW09dGhpcy5hWzNdO3RoaXMuaXA9dGhpcy5hWzhdO3RoaXMuR249dGhpcy5hWzEwXTt0aGlzLnRzPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMuUHI9YjtiLnByb3RvdHlwZT17bnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9yOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubXA6dGhpcy54bShhKX0seG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnltOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pcDp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR246dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5Qcnx8CmphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLm5yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuWmo9YjtiLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxTcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sbGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmxkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMubGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxqYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsKIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamEoKSsiMiJ9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5TcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlpqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkR2PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuWXI9YjtiLnByb3RvdHlwZT17Q3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkR2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuWXJ8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkN2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5qaj1ifSkoYyk7dmFyIEw9Yy5qanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xbz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnlvPWI7Yi5wcm90b3R5cGU9e1ZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlluOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnlvfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Wbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLnRsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5JYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnZ0KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpOjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGNmOmZ1bmN0aW9uKCl7dGhpcy5JYj0KMH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHZ0OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5paCYmTS4kdChiKX0sSHc6ZnVuY3Rpb24oKXtyZXR1cm4gZS55ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LFZxOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy50bHx8cDsoZnVuY3Rpb24oYyl7Yy52bD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPQp0aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5JYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5DYj0iIjt0aGlzLnNnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxJdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LHl0OmZ1bmN0aW9uKGIpe3RoaXMuUGU9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZX0sT2U6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD0KdGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkljKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEdnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGF4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmhxKCl8fHRoaXMuVm0oKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sVm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sCkVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxKZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkNiPWJ9LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2J9LApHaDpmdW5jdGlvbigpe3RoaXMuQ2I9bnVsbH0sTHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkNiJiYoYj0hMCk7cmV0dXJuIGJ9LFd3OmZ1bmN0aW9uKCl7dGhpcy5zZ3x8KHRoaXMuc2c9ITApfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxDdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy52bHx8dDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLk5mPSIxIjt0aGlzLk9mPSIyIjt0aGlzLkttPSIzIjt0aGlzLlBjPTA7dGhpcy5waD0zMDt0aGlzLlJiPVtdO3RoaXMuaGI9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5hZz10aGlzLmdpPQohMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5oZihiKTt0aGlzLnd0KGEpfSxmOmZ1bmN0aW9uKCl7fSxwYTpmdW5jdGlvbigpe3RoaXMuZ2l8fCh0aGlzLmdpPSEwLGUuTWUoKSl9LFRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sTXE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmphKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5qZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuTXEoKTtpZighdGhpcy5TcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5qZigpO3JldHVybn10aGlzLmpmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy4kaCgpO3RoaXMuYWc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMudmEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmhiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSwkaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJgoodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0samY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9mfSxEdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLkttfSxuYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LFRmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSxzdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5PZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUGN9LGhmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnVpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllvPXRoaXMuYVsxXTt0aGlzLkxsPXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLlhsPXRoaXMuYVs2XTt0aGlzLlJ2PXRoaXMuYVs1XTsKdGhpcy5Bbj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLnpqPWI7Yi5wcm90b3R5cGU9e1hvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Zbzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5YbDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnY6dGhpcy56bihhKX0sem46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy56anx8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuWG8oNCk7CihmdW5jdGlvbihjKXtjLkRqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuRGp8fG9hOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLAphPWIudHc7YT9hLm9hP2Eub2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5Fanx8cGE7KGZ1bmN0aW9uKGMpe2MuRmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuRmp8fHFhOyhuZXcgcWEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Mbz10aGlzLmFbNl07CnRoaXMueW49dGhpcy5hWzldO3RoaXMuY3M9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zcD1iO2IucHJvdG90eXBlPXtLbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTG86dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLnNwfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5Lbyg0KTsoZnVuY3Rpb24oYyl7Yy5zaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMueGcoKTt0aGlzLnpnKCk7dGhpcy51bz0hMX0seGc6ZnVuY3Rpb24oKXt0aGlzLmJjPQohMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0semc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpOwphLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5za3x8c2E7KGZ1bmN0aW9uKGMpe2Mucms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMTt0aGlzLmdldFBsYXllcigpOwp2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLndiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy53Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy53Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMud2I9ITApKTp0aGlzLnYoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMucGgmJgohdGhpcy52YSgpJiYodGhpcy53Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudmEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnVvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiYoYS54ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudigib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMudmEoKSYmKHRoaXMud2I/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlNjLmluZGV4T2YoYSkmJgp0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5TYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sR3I6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUWgoYS52aWRlb1RhZyk/YS5iYz90aGlzLnYoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlJjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnhnKCksYS56ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5ya3x8dGE7KGZ1bmN0aW9uKGMpe2MudGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlZxKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmYoKSl9fXRoaXMuVCgpfX0sRXc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5wOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS55YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy50a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzVdfWMudW09YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ObTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudW18fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLk1tKDQpOyhmdW5jdGlvbihjKXtjLmltPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5WKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuaW18fHhhOyhmdW5jdGlvbihjKXtjLmhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPXRoaXMuV2M9ITE7dGhpcy5DaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudGM9dGhpcy5YZz0hMTt0aGlzLlJyKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5zaCgpLHRoaXMuZm8oKSx0aGlzLnJiKCkpfSxScjpmdW5jdGlvbihiKXtyZXR1cm4gZS5BYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwKIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlgsIjsiLHR5cGVvZiBiLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWD9iLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlg/dHlwZW9mIGIuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6CiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KPwp0eXBlb2YgYi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNoKX0semI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJgoodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYj10aGlzLnpiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sS2c6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy56YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxUcTpmdW5jdGlvbigpe2lmKCF0aGlzLldnKXt2YXIgYj0KdGhpcy56YigpLGE9dGhpcy5ScSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuV2c9ITApfXJldHVybiB0aGlzLldnfSxScTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuV2MmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLldjPSEwKTtyZXR1cm4gdGhpcy5XY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuJHMoKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sJHM6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuS2coKTtpZihifHx0aGlzLnZhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0KITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZmEoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxEdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGcmJmIuYWRzJiYodGhpcy5wZz1iLmFkcyk7cmV0dXJuIHRoaXMucGd9LGZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApOwp0aGlzLnMoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLktnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuVHEoKSl7dmFyIGE9dGhpcy56YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnpiKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuemIoKX1lbHNlIHRoaXMuWGc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy56YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6KHRoaXMuZmEoITApLHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSw1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGhvOmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMueWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnljIT1iLmFkcy5zdGF0ZSYmKHRoaXMueWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLnljKXt0aGlzLnYoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMueWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhvKCl9LmJpbmQodGhpcyksMTApfSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxDYTpmdW5jdGlvbigpezA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnZhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sCm9vOmZ1bmN0aW9uKCl7dGhpcy5Nd3x8KDEwPHRoaXMubXY/KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5tdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmd0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9vKCl9LmJpbmQodGhpcyksNTApKSl9LGd0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm52KXt0aGlzLm52PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuaG18fHlhOyhmdW5jdGlvbihjKXtjLmptPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5SaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUmgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUmg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLkljKX19KX0pKGMpO3ZhciB6YT1jLmptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMucHE9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuRnA9YjtiLnByb3RvdHlwZT17QWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FaTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkZwfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuQWooNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxKczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkNiLGg9dGhpcy5rYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7dmFyIENhPWMucWx8fENhOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZWF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIucygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnphKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy50cD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnRwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuSnMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMucGx8fERhOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5tYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLnJsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuZG09dGhpcy5hWzddO3RoaXMuQms9dGhpcy5hWzEwXTt0aGlzLmtuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMubnQ9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG06dGhpcy5BayhhKX0sQWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJrOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT0KYy5udHx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2Mudm4oNCk7KGZ1bmN0aW9uKGMpe2Muams9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuSGcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5Mcz1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0OwpoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkxzKXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuamQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmpkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5qZCl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG5vOmZ1bmN0aW9uKCl7ZS5kaCh0aGlzLmpkKTtlLkZlKHRoaXMuamQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSwKSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmprfHxIYTsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zKCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5pa3x8SWE7KGZ1bmN0aW9uKGMpe2Mua2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuSGcoYiwiZWxlbWVudElEIik7aWYoZS5kaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIEphPWMua2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ebz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLm9sPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMub2x8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkNvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy4kaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT0KYX0seHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLiRqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZmI9YTt0aGlzLkNnPXRoaXMub2k9ITE7dGhpcy50aD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZmI9bmV3IHooYSkpO3ZhciBjPXRoaXMudGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuZmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UueHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmFrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkNnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdHJ5e3RoaXMuU2g/dGhpcy50Yi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMub2l8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy50Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuSWUodGhpcy5mYi51cmwpP2wuTmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5JZSh0aGlzLmZiLnVybCksdGhpcy50aCYmdGhpcy50aCgpfXJldHVybiB0aGlzLnRifX19KShjKTt2YXIgTWE9Yy5ha3x8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPQp0aGlzLldkPSExfWMua2o9YjtiLnByb3RvdHlwZT17QnQ6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxBdDpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGV0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17YXc6IkFkQ2xpY2tUaHJ1IixjdzoiQWRFcnJvciIsZHc6IkFkU3RvcHBlZCIsZ3c6IkFkTGluZWFyQ2hhbmdlIixodzoiQWRUYWdQYXJzZWQiLGx3OiJBZFZpZGVvQ29tcGxldGUiLHB3OiJBZExvYWRlZCIscXc6IkFkU2tpcHBlZCIscnc6IkFkU3RhcnRlZCIsZXc6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdzoiQWRJbXByZXNzaW9uIixidzoiQWRDcmVhdGl2ZVZpZXciLGl3OiJBZFZpZGVvTWlkcG9pbnQiLGt3OiJBZFBhdXNlZCIsCm53OiJBZFZpZGVvU3RhcnQiLG93OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGR0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5WZClmb3IodmFyIGIgaW4gdGhpcy5GYS5WZCl0aGlzLkZhLlZkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5WZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYS5nZXRFcnJvcigpOwphJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuZXQoKTt0aGlzLkZhJiZ0aGlzLmR0KCl9fX0pKGMpO3ZhciBOYT1jLmtqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmplPXRoaXMudmM9dGhpcy54Yj1udWxsO3RoaXMuSG89dGhpcy5KYj10aGlzLmtoPSExO3RoaXMuSmE9IiI7dGhpcy5maD0hMTt0aGlzLnVhPXRoaXMub2Q9IiI7dGhpcy5haD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLkJhPVtdO3RoaXMuUWc9dGhpcy5mYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuS2Q9W107dGhpcy5nYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRGM9ITE7dGhpcy5wbz10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLmxjPXRoaXMudWc9dGhpcy53Zj10aGlzLk5kPXRoaXMubGU9dGhpcy5RYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnBkPTA7dGhpcy5TZz0hMTt0aGlzLlJnPTFFMzt0aGlzLlljPSExO3RoaXMuUWE9MUUzO3RoaXMuUWY9IiJ9Yy5iaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLndjLGFkdGFnbW9kaWZpZXI6dGhpcy54YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMudmMsCmFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5raCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5Ibyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLmZoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLnVhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5haCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5mYyxob21hZEFkcGF0aDp0aGlzLlFnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5JZixIT01BRF9CTE9DS0VEOnRoaXMuR2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMubmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLkhmLHRlc3RIaWRlOnRoaXMuaGMsdGVzdFRhZ3M6dGhpcy5pYyx0ZXN0VGFnc0pTOnRoaXMuamMsCnRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLnBvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubGMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5ZYyxhZEZhbGxiYWNrVVJMOnRoaXMuUWZ9fSxmcTpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYKMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLlFuKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLndhKGEpO2Y/KHRoaXMucmQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuQmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy53Y3x8dGhpcy54Ynx8dGhpcy52Y3x8dGhpcy5qZSkmJihnPXRoaXMuTXIoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5QcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHJkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sUHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIueXc7cmV0dXJuIm5vbmUifSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuS2hdfSxCZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMucWQoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0scWg6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS53YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucWgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLnFoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LE1yOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLnhiKWZvcih2YXIgYiBpbiB0aGlzLnhiKXRoaXMueGIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueGJbYl0pKTt0aGlzLnZjJiYoYT10aGlzLkxyKGEsdGhpcy52YykpO3JldHVybiBhfSxtbzpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5pbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxpbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuQnQoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkF0KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLmZoPSEwO3RoaXMub2Q9YTt0aGlzLnVhPWI7dGhpcy5hZj0KZDt0aGlzLlBkPWY7dGhpcy56Yz1jO3RoaXMuRGE9ZXx8e307dGhpcy5tbygpO3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy5BcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9Yix0aGlzLnhjKCl9Y2F0Y2goayl7dGhpcy5oYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy5vZCt0aGlzLmdlKCJnbG9iYWwiKSksdGhpcy5jcS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiZ2xvYmFsIik7CiJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sQXI6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMudWErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5EYSYmdGhpcy5EYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRGEmJnRoaXMuRGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9CndpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuemM9ITEpO3RoaXMuemMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy56Yz90aGlzLnpjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlk9dGhpcy5haD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5HZikpO3RoaXMuTmIoKTtlLkFjKGsuRHMpOyhiPWUuQ2ModGhpcy5xZCgpKSl8fChiPWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGNxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPQp0aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZmN8fHRoaXMuSmF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy51YX1lbHNlIGE9dGhpcy51YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7CnRoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLlFnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQmEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5mYyYmdGhpcy5KYSYmdGhpcy5CYS5sZW5ndGg/dGhpcy5GYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX0sRmM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5CZCgpKSxkPXRoaXMud2EodGhpcy5mYyk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5mYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5jdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuT2w/dGhpcy5oYSgibm9TVk1Db25maWciKToodGhpcy5PbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuRmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGN1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuRGM9ITA7dGhpcy5GYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuTWIoYi5zdHJpY3QpO3RoaXMud2Y9dGhpcy5NYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy51Zz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5oYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmpjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLndjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMueGI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMudmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmplPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmtoPWIuanNwb3B1cHN8fCExO3RoaXMuSmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMubGM9Yi52cGFpZHx8ITE7dGhpcy5EYS52cGFpZD10aGlzLmxjO3RoaXMuTmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5aYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMubGk9Yi52bWFwc3x8IiI7dGhpcy5ZYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUWE9CmIuYml0cmF0ZXx8MUUzO3RoaXMuUWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuZ2M9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5XcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmdjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuRGM9ITAsdGhpcy5GYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5KdSgpJiYodGhpcy5oY3x8dGhpcy5qY3x8dGhpcy5pY3x8dGhpcy5nY3x8dGhpcy5LZCk/dGhpcy5hZj8odGhpcy5VYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLm5lKCksdGhpcy5OYigpKTp0aGlzLm11KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubnUoKSl9fSwKbXU6ZnVuY3Rpb24oKXt0aGlzLmx1KCk7dGhpcy5vdSgpfSxvdTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmFhKDEwKSxnPWUuYWEoMTApLEg9ZS5hYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS55YihhKGMpKSsKYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5oZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5EYSYmdGhpcy5EYS5wbGF5ZXImJnRoaXMuRGEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7cmV0dXJufXRoaXMuaGEoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG51OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpfSxNYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLlVhPSEwLApkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxsdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmpoKCkpdGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5pYz10aGlzLktkKSYmdGhpcy5pYy5sZW5ndGgpe3ZhciBkPXRoaXMuaWMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5wZigpfSxydTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuS2EobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuc3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmpjJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LHN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0scGY6ZnVuY3Rpb24oKXt0aGlzLmdjPyh0aGlzLnNmKyssdGhpcy5LYShuZXcgeih0aGlzLmdjKSx0aGlzLmt1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuVGgoKX0scWY6ZnVuY3Rpb24oYSl7dGhpcy5NYyh0aGlzLkhmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIisKYSl9LGt1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKTt0aGlzLm5lKCl9LGpoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sTmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVmEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLAphKyIiK2IsITApOyIxIj09PWImJihlLkFhKCJ0LW9ubGluZS5kZSIpfHxlLkFhKCJnaWdhLmRlIil8fGUuQWEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuamgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSWYpKTt0aGlzLlBkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUGQmJnRoaXMuUGQoKX0sbG86ZnVuY3Rpb24oKXtpZih0aGlzLndmJiZ0aGlzLmZxKCkpe3ZhciBhPXRoaXMuT3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LCRoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMucGR8fAoodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlJnJiYhdGhpcy5TZyYmKHRoaXMuU2c9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlJnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLm9pPSEwKTtjJiZlLldxKCkmJihhLkNnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxqbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMucmQoKXx8KGE9dGhpcy53YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxqdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0sa286ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdi5iaW5kKHRoaXMpLHRoaXMuYnYuYmluZCh0aGlzKSl9LGN2OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMucHAoKX0sYnY6ZnVuY3Rpb24oKXt9LHBwOmZ1bmN0aW9uKCl7ZS5BYyhrLm9wKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5KYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSxKdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHliOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmJrfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaT10aGlzLmFbNV07dGhpcy5rcT10aGlzLmFbM107dGhpcy5DaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbOV07dGhpcy53cT10aGlzLmFbMV07dGhpcy56az10aGlzLmFbM107dGhpcy5BbT10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy5Jdj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5ycj1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTGk6dGhpcy5qcShhKX0sCmpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ2k6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy55ayhhKX0seWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnprOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BbTp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudWo6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMucnJ8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmcuUD90aGlzLmJiPWEuZy5QKCk6dGhpcy5iYj0iIjthLmcuWmcmJmEuZy5aZyh7cGF1c2U6dGhpcy54ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuWHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZzt0aGlzLlZiPXRoaXMuWGM9ITE7dGhpcy5Obj0xRTM7dGhpcy5yYT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlduPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlZjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmCih0aGlzLlZjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5nKSYmdGhpcy5iLmcudSYmKGE9dGhpcy5iLmcudSgpKSx0aGlzLlZjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudWg9dGhpcy5HZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy53bz1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5lZD10aGlzLm9mPXRoaXMuc2I9dGhpcy5tYz0KdGhpcy53aD10aGlzLmtkPXRoaXMuTXU9dGhpcy52Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLnlzPTIwMDt0aGlzLkRmPXRoaXMuRWY9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy53ZD17fX1jLldqPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLiRiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5JZCgiY2FsbCIsdGhpcy5aYSgpKTtlLncoay5UbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxMZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnZiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihnPSEwKTtpZih0aGlzLkwuWSl0aGlzLm1mKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5MLmxvKCksYz1sLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm5oLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5sYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmcuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZy5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5MZShhLGIsZCl9LDUwKX19LFdlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5RZD10aGlzLk9iPXRoaXMua2Q9ITE7dGhpcy5jPWE7dGhpcy5HdCh0aGlzLmMpO3RoaXMud2Q9bmV3IFFhKHRoaXMuYy5ndix0aGlzLnZpZGVvLHt9KTt0aGlzLk5nKGEpO3RoaXMucmM9dGhpcy5FZyhhKTt0aGlzLnFvKCl9LE5nOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkhkPXRoaXMuWnAoYSkpLHRoaXMuTmcoYS5wYXJlbnQpKX0sRWc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZgpifHwoYz10aGlzLkVnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnAoYSkpKTtyZXR1cm4gY30sSnA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuWGQuY29kZT9lLncoay5Cdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLk1lKCksYj09Ri5MZi5jb2RlJiZlLncoay5Tcix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5ucCx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuSWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkpmLmNvZGU6ZS53KGsuZHYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5NZi5jb2RlOmUudyhrLkV2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LllkLmNvZGU6ZS53KGsuSnYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpOwpicmVhaztjYXNlIHcuVWQuY29kZTplLncoay5Ucix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLncoay4kdSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRmYuY29kZTplLncoay5hdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuS2UoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LApHdDpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuWXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5ibiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5YbShiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuSWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuJG0oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuc28oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkV0KCkpOnRoaXMuYy5vcmlnaW4udmcody5VZCl9LEV0OmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnNiPXRoaXMubWM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5uZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMuc2I9ITApO2Uub2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnRhJiZlLmFuKHRoaXMuYy5vcmlnaW4udGEpO2UuZ2IoInNldFVwVnBhaWQiKTt0aGlzLklkKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnhoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuYnEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZWcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnJjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMucHYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5xdigpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9CiEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy51digpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMueXYoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMud3YoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMueHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy56digpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy52digpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5taSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsubWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLlljJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnR2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5jZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5FZiYmCih0aGlzLkRmPSExLHRoaXMuZWMoKSksdGhpcy5zdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMuc2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLnZmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5iZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sc3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubWM9ITF9LHV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHF2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZ2IoImltcHJlc3Npb24iKTt0aGlzLlBoKCk7ZS53KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZ2IoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx3djpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO2UuZ2IoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LHh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmdiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5nYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx2djpmdW5jdGlvbigpe3RoaXMueWYoKTtlLmdiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LG1pOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZ2IoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxwdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmdiKCJlcnIiLGIpO2UudyhrLkF2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5taSghMCl9LFhtOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5yZCgpKXt2YXIgZD1iLndhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubHYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5ObikpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5YYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlhjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC51Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuaHYoKTt0aGlzLmhpKCk7dGhpcy5mZygpO3RoaXMuYi54aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlNmKCl9LFNmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5TZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLlJtLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSxVbTpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjwKYS5sZW5ndGg7ZisrKWM9ZS5JZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLld0KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5SZCYmdGhpcy5VbSh0aGlzLmMuUmQpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5RZHx8KGUudyhrLlZyLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnVifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLlZiPXRoaXMuWGM9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5vZj0KITA7dGhpcy5iLkJlKCk7dGhpcy5hYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudWImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucmgoKTp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxsdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5qbygpO3RoaXMuYy5vcmlnaW4udmcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5NdSl0aGlzLlJhKCk7CmVsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZy5MYSYmIXRoaXMub2YmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmNkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlJ1KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YiwKcGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnViPyh0aGlzLlZiPXRoaXMuWGM9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6CnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy53aHx8KHRoaXMud2g9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFJ1OmZ1bmN0aW9uKGEpe2UudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZiKSx0aGlzLnZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5QaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlVmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLlJmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYKKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmNpPWEpfSxJZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sUGg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHwKdGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMud2QmJnRoaXMud2QudHJhY2smJnRoaXMud2QudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuJHAodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkhkLmltcHJlc3Npb25zJiZlLlVxKGcudXJsLHRoaXMuSGQuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsCmcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5TbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLkZvKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuRWYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5XbShjKSxmfHwoZj10aGlzLnRnKSxlfHwoZT10aGlzLnRnKSx0aGlzLlltKGEpLHRoaXMuTC5LYShiLApmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LHFvOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sWnQ6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sJHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxGbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuanYuYmluZCh0aGlzKSl9LApqdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLncoay5tZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWWMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOgooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuWmMmJihiPXRoaXMuTC5aYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5BYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LApBYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLndvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0KIkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksCmcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk91LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTnUuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkJiKCk7dGhpcy5BYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksCmwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSksCnRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5CYigpO3RoaXMuQWIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy54YSYmKHRoaXMueGEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmJnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsubmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlFlKCkpO3RoaXMuQmIoKX19LEJiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx4ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLlRjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LE91OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFh1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5RYyl8fHRoaXMudWg/KHRoaXMuZWQ9ITAsdGhpcy52YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52YiksdGhpcy52Yj0hMSksdGhpcy5vZygpKToodGhpcy51aD10aGlzLkVmPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZWcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuWnQoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnlzKToodGhpcy5vZj0hMCx0aGlzLmIuQmUoKSx0aGlzLmIuaXQoKSx0aGlzLmFjPSExLGUudyhrLnZvLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy54ZSgpLkdoKCkpfSwKeGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sZmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnhkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuV24rIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSmcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkpnKCkpO3JldHVybiBhfSx0ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuV2p8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLnl1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMubG49YjtiLnByb3RvdHlwZT17RHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkVxOnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55dTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMubG58fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsCm5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5EcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkVhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMucWM9dGhpcy5zYz0hMTt0aGlzLnRhPSIiO3RoaXMuQmY9ITE7dGhpcy5VZz0iIjtkJiZkLmVtcHR5P3RoaXMuRnIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5lbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5oZCgpLGI7Yj1lLndhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTsKYj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC55YShsLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucWcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuSmQoYSkpKyImdHlwZT1qcyIsYj1sLnlhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwueWEobC5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS4kYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuJGJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLiRifHx0aGlzLlpxKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLmp1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LFpxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sRXI6ZnVuY3Rpb24oYSl7dGhpcy5TcyhhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5VZz1hLnJlc3BvbnNlVVJMO3RoaXMuWC5sZW5ndGg/dGhpcy5IYygpOnRoaXMucWEodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLkJmP0YuWGQ6CkYuS2Z9KSl9LEZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5YLmxlbmd0aD90aGlzLkhjKCk6dGhpcy5xYSh0aGlzLlNhKHcuT2Mse2Vycm9yOnRoaXMuQmY/Ri5YZDpGLktmfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5TYSh3LkpmLHtkZXB0aDphfSkpfSxIYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLmFyKCk/dGhpcy50dSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLk9nKCksaCx7QWRTeXN0ZW06dGhpcy5JcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnFhKHRoaXMuU2Eody5NZikpOihhPTAsdGhpcy5ZdSgpJiZ0aGlzLldlKHRoaXMueG8oKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMuc2M/Cih0aGlzLnNjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkhjKCkpOnRoaXMucGFyZW50LlJlKCl9LHJoOmZ1bmN0aW9uKCl7dGhpcy5xYz8odGhpcy5xYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5IYygpKTp0aGlzLnBhcmVudC5yaCgpfSxZdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1KCk/dGhpcy5wdSgpPyEwOigtMSE9dGhpcy5CYygpP3RoaXMucWEodGhpcy5TYSh3LlRkKSk6dGhpcy5xYSh0aGlzLlNhKHcuRmYpKSwhMSk6KHRoaXMucWEodGhpcy5TYSh3Lk9jLEYuTGYpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVWcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5OZSgpKTthLnViPWEudWI/YS51Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5CZzt0aGlzLnBhcmVudC5XZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5CYygpO2EuTz10aGlzLkxnKCk7YS5VYj10aGlzLktwKCk7YS5ndj1bXTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkhwKCk7YS5sZj10aGlzLllwKGEuZHVyYXRpb24pO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYil7dGhpcy50YXx8KHRoaXMudGE9IiIpO2IuJGE9Yi4kYT9iLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHAoKSk6Yi5QYS5jb25jYXQodGhpcy5UcCgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LldiJiZ0aGlzLnBhcmVudC5XYihiKSxhPTAsdGhpcy5IYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGIpLGE9MCl9LFdiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LldiKGEpfSx2ZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx0dTpmdW5jdGlvbigpe3JldHVybiBhPGh9LHF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5MZygpLmxlbmd0aH0scHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkJjKCl9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LFNzOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxhcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2coKS5sZW5ndGh9LE9nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sSXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmJoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5iaChhLnBhcmVudE5vZGUpOiExfSxUcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxMcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCkxnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHp3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxIcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLm5kKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxCYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFlwOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVnQoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuZW18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR209dGhpcy5hWzFdO3RoaXMuVnU9dGhpcy5hWzddO3RoaXMubXQ9dGhpcy5hWzhdO3RoaXMuUHE9dGhpcy5hWzZdO3RoaXMuQ249dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMV19Yy5Sbj1iO2IucHJvdG90eXBlPXtGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMubHQoYSl9LGx0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUHE6CnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dbjp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlJufHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5GbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQT10aGlzLnBjPXRoaXMudWI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5zbD1iO2IucHJvdG90eXBlPXtzbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxScDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRWEpe3ZhciBhPXRoaXMub3JpZ2luLkVhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxKZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5ScCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sYnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLnNsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbNl07dGhpcy55aT10aGlzLmFbOF07dGhpcy5jcj0KdGhpcy5hWzRdO3RoaXMub209dGhpcy5hWzddO3RoaXMubWo9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNV19Yy5Fbz1iO2IucHJvdG90eXBlPXtIbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW06dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Fb3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuSG0oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsCmNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE9hOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LE1mOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSwKSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxadjp7dHlwZToiZXJyb3IiLApjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtLZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxMZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSwkdjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbN107dGhpcy5icD10aGlzLmFbMl07dGhpcy5ucz10aGlzLmFbN107dGhpcy5Taj10aGlzLmFbNF07dGhpcy5BaT10aGlzLmFbNl07dGhpcy55cT10aGlzLmFbMl07dGhpcy5LdD10aGlzLmFbMV07dGhpcy5pcj10aGlzLmFbNV07dGhpcy5JdD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLkVtPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52czp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYnA6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tajp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWk6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlxOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLkt0OnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pcjp0aGlzLkh0KGEpfSxIdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkVtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy51cyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuQ2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DcT10aGlzLmFbNF07CnRoaXMudXE9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzNdfWMuSXM9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNxOnRoaXMudHEoYSl9LHRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51cTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuSXN8fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkJxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLk9kPVtdO3RoaXMuRWg9W107dGhpcy5TZT1bXTt0aGlzLmt2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7CnRoaXMuTSgpfWMuTWs9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtlLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGc9ZS5jb250ZW50V2luZG93O2cuVXc9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuZnQuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuWHMuYmluZCh0aGlzKX07dmFyIGs9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmsub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtnLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7dGhpcy5PZC5wdXNoKHtzcmM6YyxmcmFtZTplLENzOmYsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlNlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuU2VbYl07Yy50eXBlPT09YSYmYy4kbih0aGlzLk1wKGEpKX19LE1wOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e2N4OiEwLGJ4OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e1F3OiJ2aWRlbyIsZXg6ImpzQ3VzdG9tIixmeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxneDoxLEF3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sYXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLk9kLmxlbmd0aDtiKyspaWYodGhpcy5PZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLk9kW2JdLkNzO3JldHVybiIifSxmdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuYXEoYiksdmVuZG9yOmJ9KTsKdGhpcy5YdCgpfSxYczpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMua3YubWFwKGZ1bmN0aW9uKGEpe3RoaXMuY2coYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5jZyhhLGIpfSxjZzpmdW5jdGlvbihhLGIpe3RoaXMuU2UucHVzaCh7dHlwZTphLCRuOmIsJHc6ITF9KX0sWHQ6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLlhxfHwoYS5Udyh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuZHgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLlhxPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO3ZhciBRYT1jLk1rfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kaz10aGlzLmFbMTBdO3RoaXMuTmw9dGhpcy5hWzNdO3RoaXMuTHY9CnRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLnBqPXRoaXMuYVs5XTt0aGlzLmtyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzddfWMuRmk9YjtiLnByb3RvdHlwZT17Wms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRrOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ObDp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTHY6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhrOnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLkZpfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuWmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5nPWE7dGhpcy5qYj1hLkdnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuZGc9ITE7dGhpcy5UYj1bXX1jLm5qPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYsCnk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5pcShhKSxnPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtnPXt4OmIseTpjfTtmJiYoZy5wb3NpdGlvbj1mKTtyZXR1cm4gZ30sYnU6ZnVuY3Rpb24oKXt0aGlzLmRnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0seGg6ZnVuY3Rpb24oKXt0aGlzLmcucGF1c2UoKTtlLncoay5jZCx0aGlzLmcudSgpKX0saXQ6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5nLnBsYXkoKSxlLncoay5kZCx0aGlzLmcudSgpKSl9LGtmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuamIpO3RoaXMuZy5KYyYmdGhpcy5nLkpjKCk/dGhpcy5nLkdnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sCmlxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx4cDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueHAodGhpcy5qYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5nLkpjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5RaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxiZzpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMubmp8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLll2PXRoaXMuYVs2XTt0aGlzLmdwPXRoaXMuYVs2XTt0aGlzLk10PXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLndqPXRoaXMuYVs5XTt0aGlzLndpPXRoaXMuYVs5XTt0aGlzLlNpPXRoaXMuYVs3XTt0aGlzLnpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLkJzPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnY6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLll2OnRoaXMuZnAoYSl9LGZwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncDp0aGlzLkx0KGEpfSxMdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXQ6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJzOgp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLndpOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Cc3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuTXYoNCk7KGZ1bmN0aW9uKGMpe2Muamw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwKKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5EZChiKTt0aGlzLnJnKCl9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxyZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiYKYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5qbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuaWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlZmPXRoaXMuWGY9CnRoaXMuWWc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMudXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWWcmJnRoaXMubGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYWQoKTt0aGlzLllnPSEwO3RoaXMubGcoKX0uYmluZCh0aGlzKSk7CnRoaXMuaGcoKX0sbGc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5hZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5hZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVmYmJiF0aGlzLlhmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0sYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE1nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGhnOmZ1bmN0aW9uKCl7aWYodGhpcy5hZCgpKXt2YXIgYj0KdGhpcy5NZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlhmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVmY9Yi54d310aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLk93KCk6ITF9LEJjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5CYygpOi0xfSxVcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx1cDpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMucygiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCl9LmJpbmQodGhpcyksMTAwKX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlVwKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuaWx8fGRiOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWXE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ud2wuTG0uSm0/d2luZG93Lk9PLndsLkxtLkptLnZ3KGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZcSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMua2x8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jcj10aGlzLmFbNV07dGhpcy5xaz10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbMl07dGhpcy5qPQp0aGlzLmFbOF19Yy5Jaz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXI6dGhpcy5wayhhKX0scGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFrOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuSWt8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkhyKDQpOyhmdW5jdGlvbihjKXtjLmFqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5QZygpfSxQZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7CmJ8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlYoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LApOYTpmdW5jdGlvbigpe3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlcmJigwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLmFqfHxoYjsoZnVuY3Rpb24oYyl7Yy4kaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxpZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnYoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnBhKCk6dGhpcy5tKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5pZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmlnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LERoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwKKGIuRGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudnB8fCh0aGlzLnZwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5EaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuRGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixUPW5ldyBqYihyKTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRW49dGhpcy5hWzVdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuR2s9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsyXTt0aGlzLm1rPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLnlsPXRoaXMuYVs0XTt0aGlzLmV1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuT289YjtiLnByb3RvdHlwZT17RG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVuOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kajp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxqOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHI6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlsOnRoaXMuZHUoYSl9LApkdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmV1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Pb3x8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuRG4oNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSmM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLlVsfHxVOyhmdW5jdGlvbihjKXtjLlRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuVWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnYuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTsKeS5VYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmFzKGEpfS5iaW5kKHRoaXMpKTt5LlVjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuVWMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LmVxKCl9LGFzOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudigpO3RoaXMucGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwKMTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLnYoKTt0aGlzLnBhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5UbHx8VjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy52ZCYmKGI9ZS5HbyhiLHRoaXMudmQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7CnZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmYoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy52ZHx8KHRoaXMudmQ9W10pLHRoaXMudmQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFVjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LHV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuR2N8fAoodGhpcy5HYz1bXSksdGhpcy5HYy5wdXNoKGIpLHRoaXMuaHQoKSYmKHRoaXMuY2YoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sZXE6ZnVuY3Rpb24oKXtpZih0aGlzLkdjKWZvcih2YXIgYj0wO2I8dGhpcy5HYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkdjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPQpiLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkudXUoYil9fSl9KShjKTt2YXIgbGI9Yy5WbHx8bGIseT1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbMl07dGhpcy5rdD10aGlzLmFbNF07dGhpcy5tcj10aGlzLmFbNl07dGhpcy52az10aGlzLmFbMV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5JdT10aGlzLmFbOF07dGhpcy5DdT10aGlzLmFbOF07dGhpcy5Waz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkZxPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ncjp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1yOnRoaXMudWsoYSl9LAp1azpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudms6dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkF1OnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5JdTp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3U6dGhpcy5VayhhKX0sVWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5GcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnYoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpOwphLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuWWl8fG9iOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgbmIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgb2IoZSx0aGlzLkkpKS5mKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9CmIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuWml8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Uaz10aGlzLmFbNl07dGhpcy5Bcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnVyPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ubjp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGo6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vazoKdGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5pOnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Uazp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLnVyfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5tbig0KTsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuV3ModGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sV3M6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWmc6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5Ya3x8c2I7KGZ1bmN0aW9uKGMpe2MuV2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5pPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm5hKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLldrfHx0YjsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5JKSkuZigpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpO3ZhciB1Yj1jLllrfHx1YixXPW5ldyB1YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucnA9dGhpcy5hWzRdO3RoaXMua3A9dGhpcy5hWzNdO3RoaXMuRHA9dGhpcy5hWzddO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuaWo9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuaWp8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnFwKDQpOyhmdW5jdGlvbihjKXtjLmxtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLmxtfHx3YjsoZnVuY3Rpb24oYyl7Yy5rbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sVXM6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE/dGhpcy5Vcyh0aGlzLnphKToodGhpcy56YT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuemEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmCnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5lYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5lYlthXSYmMzAzIT10aGlzLmViW2FdJiY0MDMhPXRoaXMuZWJbYV0mJihiPSExKTtpZihiKXRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLmttfHx4YjsoZnVuY3Rpb24oYyl7Yy5tbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5JKSkuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLm1tfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnE9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuaGs9YjtiLnByb3RvdHlwZT17SXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuaGt8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLklxKDQpOyhmdW5jdGlvbihjKXtjLklsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVihiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuS3MoKX0uYmluZCh0aGlzKSw1MDApfSxLczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFl0OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Lcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Lcj8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWXQoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLkhsfHxDYjsoZnVuY3Rpb24oYyl7Yy5KbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuSmx8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdT10aGlzLmFbMV07dGhpcy5mdj10aGlzLmFbNV07CnRoaXMuZXM9dGhpcy5hWzZdO3RoaXMuTHE9dGhpcy5hWzJdO3RoaXMucW49dGhpcy5hWzEwXTt0aGlzLlFvPXRoaXMuYVs0XTt0aGlzLmxzPXRoaXMuYVs5XTt0aGlzLndtPXRoaXMuYVszXTt0aGlzLmpzPXRoaXMuYVsxMF07dGhpcy5XaT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs2XX1jLmRqPWI7Yi5wcm90b3R5cGU9e0t1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmVzOnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5McTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucW46dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Rbzp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy52bShhKX0sCnZtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53bTp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpzOnRoaXMuVmkoYSl9LFZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuZGp8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLkt1KDQpOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7CnZhciBHYj1jLkRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMudnIoKTp0aGlzLmtnKCk7Yi5hdXRvcGxheSYmCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHRvOmZ1bmN0aW9uKCl7dGhpcy5UZigpfHx0aGlzLm0oITApfSx2cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5vYSYmYi5YJiZiLnV3JiZiLnd3JiYodGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2coKX0uYmluZCh0aGlzKSwxMDApfSxtZDpmdW5jdGlvbigpe2lmKCF0aGlzLnZoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy52aD1iW2NdKTtyZXR1cm4gdGhpcy52aH0sUHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5DbHx8SGI7KGZ1bmN0aW9uKGMpe2MuRWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmYoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLkVsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzFdO3RoaXMuSGk9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs5XTt0aGlzLmVyPXRoaXMuYVsxXTt0aGlzLm1xPXRoaXMuYVs1XTt0aGlzLml1PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMud3A9CmI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5obDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5IaTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3I6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMubHEoYSl9LGxxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tcTp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLndwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5nbCg0KTsKKGZ1bmN0aW9uKGMpe2MuS2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5WKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxOdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxKYzpmdW5jdGlvbigpe3JldHVybiEwfSxJYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuS2t8fFg7KGZ1bmN0aW9uKGMpe2MuSms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLlZ3KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmt8fFk7KGZ1bmN0aW9uKGMpe2MuTGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5mKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5tYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBHLExiPWMuTGt8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuZ3U9dGhpcy5hWzJdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzNdO3RoaXMuV3Y9dGhpcy5hWzEwXTt0aGlzLmZqPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLld1PWI7Yi5wcm90b3R5cGU9e2ZzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nczp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3U6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbzp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmo6dGhpcy5WdihhKX0sVnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLld2OnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuV3V8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLmZzKDQpOyhmdW5jdGlvbihjKXtjLlVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksCmEmJmM/KHRoaXMuVihjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LExhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxTdzpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlVqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Uaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlRqfHxQYjsoZnVuY3Rpb24oYyl7Yy5Waj0KcC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmd2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMoKTtpZihiJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5tYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5mKCkpfX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlZqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Y9dGhpcy5hWzJdO3RoaXMuZm49dGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzhdO3RoaXMueWo9dGhpcy5hWzNdOwp0aGlzLlJzPXRoaXMuYVs4XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs1XX1jLmVrPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hdjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZm46dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLktuOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJzOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmVrfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuQ209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVihhKX1lbHNlIHRoaXMuY2EoKX0sTWQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSwKZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxWczpmdW5jdGlvbigpe3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuU2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlNkfHwodGhpcy5TZD0hMCx0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKTGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLkNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5CbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxaczpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSl9LCRjOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMucygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxQZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPQowO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuJGMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlBmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuWnMod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5QZigpO3RoaXMuWXMoKX0sWXM6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuVHM/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5Ucz0KITB9fSl9KShjKTt2YXIgVWI9Yy5CbXx8VWI7KGZ1bmN0aW9uKGMpe2MuRG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5WcygpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMuRG18fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJHI9dGhpcy5hWzldO3RoaXMuUmw9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOV19Yy5zcT1iO2IucHJvdG90eXBlPXtacjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLiRyOnRoaXMuUWwoYSl9LFFsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuc3F8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLlpyKDQpOyhmdW5jdGlvbihjKXtjLmFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLApiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Rcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnloJiYodGhpcy55aD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMuYW18fE87KGZ1bmN0aW9uKGMpe2MuJGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0semE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5EdCgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuJGx8fFA7KGZ1bmN0aW9uKGMpe2MuYm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLk5rPWI7Yi5wcm90b3R5cGU9e09pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuTmt8fCRiLFhjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLk9pKDQpOyhmdW5jdGlvbihjKXtjLkRrPQp0LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVihhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuQ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmc9MDt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPQp0aGlzLldjPSExO3RoaXMuQ2g9ZS5IYigxMCk7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlZnKys7aWYoMTA8dGhpcy5WZyl0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5tKCEwKTp0aGlzLm0oKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVoLmJpbmQodGhpcyksMTAwKSwhMX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudmEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Da3x8YWE7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgYWM9Yy5Fa3x8YWMsYmM9bmV3IGFjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5CcD10aGlzLmFbMTBdO3RoaXMudHI9dGhpcy5hWzldO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLmJvPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5Qaz10aGlzLmFbN107dGhpcy5Icz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5zaj1iO2IucHJvdG90eXBlPXtBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50cjp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSmk6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xdDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUGs6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2p8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFwKDQpOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7CnZhciBkYz1jLlBqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Paj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qZygpfSxqZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuT2p8fGVjOyhmdW5jdGlvbihjKXtjLlFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsKKG5ldyBlYyhiLHRoaXMuSSkpLmYoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuUWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbj10aGlzLmFbNl07dGhpcy5naz10aGlzLmFbOV07dGhpcy5CbD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbMV07dGhpcy5xcj10aGlzLmFbNV07dGhpcy5Gcz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLlNsPWI7Yi5wcm90b3R5cGU9e2NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kbjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ2s6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJsOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Cbzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLnFyOnRoaXMuRXMoYSl9LEVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuU2x8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmNuKDQpOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5yaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5tZSgpO3RoaXMuZ2coKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSwKZ2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9LG1lOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fApiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMucGl8fGpjOyhmdW5jdGlvbihjKXtjLnNpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMuc2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ycT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmZsPWI7Yi5wcm90b3R5cGU9e3FxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuZmx8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnFxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmdoPXRoaXMuaWg9dGhpcy5oaD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjPwpudWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj8KbnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLnVsPWI7Yi5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuVnAoYSk6W10sYjt0aGlzLmloPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmhoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5naClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYKYSBpbnN0YW5jZW9mIHA/ITA6ITF9LFZwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LCR0OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiB0JiYhdGhpcy5oaClmb3IodGhpcy5naD0hMCxhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnlkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMudWx8fG5jLE09bmV3IG5jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNvPXRoaXMuYVs3XTt0aGlzLlF1PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVs3XTt0aGlzLmhuPQp0aGlzLmFbNl07dGhpcy5TdD10aGlzLmFbMV07dGhpcy5Wbj10aGlzLmFbOV07dGhpcy53dT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLnJvPWI7Yi5wcm90b3R5cGU9e1JvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tbzp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUXU6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5objp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZuOnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5yb3x8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlJvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkFjKGsuWnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkFjKGsuVXIpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsCiIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmphKCk7SS4kZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuamEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLiRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5qYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2UuQWcod2luZG93LEkuTnEoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTsKZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbN107dGhpcy5nbT10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbNV07dGhpcy5Qdj10aGlzLmFbNF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzddO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy56bD1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Sazp0aGlzLk92KGEpfSxPdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHY6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy54cjp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5vOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2w6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy56bHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnpoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy50ZD0wOwp0aGlzLmJiPSIiO3RoaXMuemQ9W107dGhpcy5BZD0wO3RoaXMuQmg9ITE7dGhpcy5aZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXt0aGlzLnpoPWF9LGhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdXQ6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx0dDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxLYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5RcSgpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIudWEsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuS2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLnpjKTtlbHNlIGlmKHRoaXMuZ3EoKSl0aGlzLm90KGZ1bmN0aW9uKCl7dGhpcy5LYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuY2QsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLApnKTtsLnN0KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5KcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkplJiYoYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnRkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudGQuZ2V0VGltZSgpLHRoaXMudGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnRkPWE7cmV0dXJuITF9LFV0OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMud2coYSkpP3RoaXMuS2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5kZCx0aGlzLnBsYXllci51KCkpKX0sVHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuemgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLnp0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLndnKGMpKT90aGlzLktjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5kZCx0aGlzLnBsYXllci51KCkpKX19LHdnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxidDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkZ0KHRoaXMuVHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5vaCl7dGhpcy5vaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5LYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5kZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxhdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnl0KHRoaXMuRmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuT2UoKX0sZjpmdW5jdGlvbigpe3RoaXMuVXQoKTt0aGlzLnBsYXllci5PZSYmdGhpcy5hdCgpO3RoaXMuYnQoKX0sY3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy56ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuVXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkFkPXRoaXMuemQubGVuZ3RofSxncTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5BZCYmKGE9ITApO3JldHVybiBhfSwKb3Q6ZnVuY3Rpb24oYSl7dGhpcy5CaD1hO2ZvcihhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXVsiZnVuY3Rpb24iXSh0aGlzLk9zLmJpbmQodGhpcykpfSxPczpmdW5jdGlvbihhKXt0aGlzLkFkLS07YSYmdGhpcy5aZS5wdXNoKGEpOzA+PXRoaXMuQWQmJnRoaXMuQmgoKX0sSnI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWmUubGVuZ3RoO2MrKyliPXRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUXQ9dGhpcy5hWzZdO3RoaXMucW09dGhpcy5hWzZdO3RoaXMuQXE9dGhpcy5hWzFdO3RoaXMuZXA9dGhpcy5hWzddO3RoaXMuSm89dGhpcy5hWzRdO3RoaXMuT3Q9dGhpcy5hWzVdO3RoaXMuYmw9CnRoaXMuYVs4XTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuUW09YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlF0OnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xbTp0aGlzLnpxKGEpfSx6cTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXE6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kbzp0aGlzLk50KGEpfSxOdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT3Q6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJsOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUW18fHFjLGVkPW5ldyBxYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5QdCg0KX0pLmNhbGwoc2hvaFZvb25waXVOZWFnaSxzaG9oVm9vbnBpdU5lYWdpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.9.6 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.6.9.76.144.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:14 GMT
Last-Modified
Wed, 24 Jul 2019 10:17:21 GMT
Server
openresty/1.15.8.2
ETag
"5d383031-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame FB84
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
bdd5b73f30871bd02b98a5756eb08f51a88e8d31094fac1b34a2ddd1abeb6dcb

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
text/javascript
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 7C48
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-35/html/container.html?n=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3491
date
Sat, 28 Sep 2019 07:41:29 GMT
expires
Sun, 27 Sep 2020 07:41:29 GMT
last-modified
Fri, 21 Jun 2019 14:35:26 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
65084
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/ Frame A6C7
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
d23b76d0502f01f486b0025cdb942713385d66f4775fc86af7166da3c26313c1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569582964828766"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29086
x-xss-protection
0
expires
Sun, 29 Sep 2019 01:46:13 GMT
5158542952
api.yieldlove-ad-serving.net/v1/bl/4444/
44 B
294 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5158542952
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.196.191.159 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-196-191-159.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
af2768521c0dea23cc763c9bd033e5839051bbf1557d001555553e4515a90b9d

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Sun, 29 Sep 2019 01:46:02 GMT
Cache-control
public, max-age=604800
Connection
keep-alive
X-Key
/bl/4444/5158542952
Transfer-Encoding
chunked
Content-Type
application/json
activeview
pagead2.googlesyndication.com/pcs/ Frame 4DFC
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsveDQ1yw9wpxlsHRtZAbZO_uvM2o9PdRQxg_or1Vut6c5osgstNK1uy2wY-d40IUq0vpfUjPQ0yJNpdI8zvPPBMf341zfldIYUW_aTUtaM&sig=Cg0ArKJSzBSWOBs3rh40EAE&adk=3040188762&tt=-1&bs=1585%2C1200&mtos=1049,1049,1049,1049,1049&tos=1049,0,0,0,0&p=121,429,211,1157&mcvt=1049&rs=3&ht=0&tfs=712&tls=1761&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=571&niot_cbk=578&md=2&lm=2&rst=1569721573047&rpt=105&isd=0&msd=0&oseid=3&xdi=0&ps=1585%2C5164&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-37-18-14-114-16-0-0-0&tvt=1757&r=v&id=osdim&vs=4&za&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190927
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:14 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 8E2D
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsvywDn8xiHvQqM-5pIS3MKgTx4ceQcy1V9vyEie9CwMBrJwERikRo7JNCyYg0al0vuRyoSLjuB7ltD94v4eB7j3lrT-DlC1CK_l5sH0_Ps&sig=Cg0ArKJSzCy7RT2i94z3EAE&adk=1819065434&tt=-1&bs=1585%2C1200&mtos=1059,1059,1059,1059,1059&tos=1059,0,0,0,0&p=121,1318,721,1478&mcvt=1059&rs=3&ht=0&tfs=815&tls=1874&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=710&niot_cbk=713&md=2&lm=2&rst=1569721573188&rpt=27&isd=0&msd=0&oseid=3&xdi=0&ps=1585%2C5164&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-40-19-14-121-17-0-0-0&tvt=1868&r=v&id=osdim&vs=4&za&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190927
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:14 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
vast
tracking.m6r.eu/sync/ Frame 0DC8
490 B
926 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/vast?checkcookies=true&ibbId=&slotId=346a3f1b-2167-4e54-8af3-4a8d2910a189&target=https%3A%2F%2Fvideo-adserver.ibillboard.com%2FgetAd%3Ftagid%3D346a3f1b-2167-4e54-8af3-4a8d2910a189%26bust%3Dfff9202189%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3D3587f960-7fb5-4072-8178-6da7c2bfc99e
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
aff49914c3f16bd7565f729e7d12de15706342599b511dada7736bbf3df8ca29

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:14 GMT
Server
nginx
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/xml; charset=utf-8
Content-Length
490
activeview
pagead2.googlesyndication.com/pcs/ Frame A6C7
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssEIBTXsujupmMjVeQzGA4sXvs2ELttI9ELzHokOaJc4cz0Jc8Op-TvInCZbHs0cXecyKXfGT2k7QroVK6oApOYKWwGV8M0XFvUiF4TDqs&sig=Cg0ArKJSzLVnJAbUeKXdEAE&adk=3694558186&tt=-1&bs=1585%2C1200&mtos=1061,1061,1061,1061,1061&tos=1061,0,0,0,0&p=278,968,528,1268&mcvt=1061&rs=3&ht=0&tfs=1020&tls=2081&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=915&niot_cbk=922&md=2&lm=2&rst=1569721573393&rpt=84&isd=0&msd=0&oseid=3&xdi=0&ps=1585%2C5164&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-46-21-14-135-19-0-0-0&tvt=2077&r=v&id=osdim&vs=4&za&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190927
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:14 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
getAd
video-adserver.ibillboard.com/ Frame 0DC8
48 B
590 B
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=fff9202189&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=3587f960-7fb5-4072-8178-6da7c2bfc99e
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:14 GMT
Server
ibillboard
Vary
*
Content-Type
text/xml
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
48
Expires
Tue, 01 Jan 1991 00:00:00 GMT
userconnect
ih.adscale.de/
546 B
928 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=192243&cbfn=stroeerCoreConnect&ts=1569721574736&umd=false
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
015c60de008c2c09f653fd7b36ba0bf4170e49bc983293ebae6c73521e043ce1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:14 GMT
Server
Apache-Coyote/1.1
Content-Type
application/javascript
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
546
Expires
Sun, 29 Sep 2019 01:46:14 GMT
/
ssl.1.damoh.giga.de/4ccf8230590d6e42e6c940948b40ec5e72b6f2bf/ Frame 585E
109 B
671 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/4ccf8230590d6e42e6c940948b40ec5e72b6f2bf/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHNob2hWb29ucGl1TmVhZ2k9c2hvaFZvb25waXVOZWFnaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuVWV8fCh5LlVlPTApO3kuVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5abillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5jZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS51dChsKTthLnR0KG0pO2EuY3QoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGE9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5DdCh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzFdO3RoaXMucHM9dGhpcy5hWzRdO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuSHE9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy56bz1iO2IucHJvdG90eXBlPXtZbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmw6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVvOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSHE6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy56b3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWm49ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5vZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLk5zLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5UZz17fTt0aGlzLmVmPSExfWMuWWo9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrCnRoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5UZ1thXSYmKHRoaXMuVGdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5hdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGFuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmCihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxsYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sTnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuTXMoYS5kYXRhKX0sTXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxoZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSwKcWc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMubGgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LElnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFptOmZ1bmN0aW9uKGEsCmIpe2lmKGImJiEoMD50aGlzLndhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuRXAoYSkpcmV0dXJuOyhiPXRoaXMucWcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxFcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx5ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZ2I6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfY2FjaGVfIithLGIsITApfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seWU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxIZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUWg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sCkhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixmLGQ7Zm9yKGY9NzswPD1mO2YtLSlkPWE+Pj40KmYmMTUsaCs9ZC50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHgsdSxyLHA7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgdD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx0LnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IodC5wdXNoKGYpOzE0IT10Lmxlbmd0aCUxNjspdC5wdXNoKDApO3QucHVzaChuPj4+MjkpO3QucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx0Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXRbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eD1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspcD1kKHEsNSkrKG4meHx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9MjA7Mzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTQwOzU5Pj1mO2YrKylwPWQocSw1KSsobiZ4fG4mdXx4JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eCwKeD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NjA7Nzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreCY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxoZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cSkmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxIazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LFBuOmZ1bmN0aW9uKCl7cmV0dXJuIGEuUWkoKXx8YS5jaigpfHxhLm5xKCl8fGEubGwoKXx8YS5ybSgpfHxhLkhrKCl8fGEuUGwoKX19O3JldHVybiBudWxsIT1hLlBuKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sQ2M6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sQWE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sWHA6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEdvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LFZ0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LERnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5kaShiKSsiOiIrdGhpcy5kaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGdmOmZ1bmN0aW9uKGEpe3RoaXMuJGI9YX0sQWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy4kYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKQWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkFnKGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQWMoQil9LFBzOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuWHAoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxXdDpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlBzKGEpO2lmKGIpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5CZCgpO2wueWEoYSwhMCk7YT1sLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuS2EoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLk5jfHwodGhpcy5OYz17fSk7dGhpcy5OY1tmXXx8KHRoaXMuTmNbZl09MCk7dGhpcy5OY1tmXSsrOzEwPHRoaXMuTmNbZl18fChmPQpsLkJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZil7dmFyIGQ9ITE7Zj1mLnJlc3BvbnNlVGV4dDt0cnl7Zj1KU09OLnBhcnNlKGYpLGY9Zi5kYXRhLGZbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGQ9ITApLGZbMV0mJmZbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGQ9ITEpfWNhdGNoKGMpe31kfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZlswXT9mWzBdOiIiKSsoZlsxXT9mWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LApNZTpmdW5jdGlvbigpe2wmJmwuWT9sLmlzRW5hYmxlZCYmbC5rbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxlZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuJHEoYSl8fDA8PQphLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZGYmJndpbmRvdy5zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueWcoYSkpcmV0dXJuIHRoaXMueWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTsKYy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkphLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlptKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIG09ZXx8bDtlPSEwO2smJihlPSExKTtpZihtJiZtLlkpaWYobS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle20ueWEoYSxlKTtlPW0ueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbS5LYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLG0sZyxrKX0uYmluZCh0aGlzKSw1MDApfSxsaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sRHI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMubGgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTGMpZm9yKHZhciBjIGluIHRoaXMuTGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5MY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sbWg6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuSmEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkRyKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkxjPWF9LFV2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxRbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFVxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLllqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlhqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuRHM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLAptZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLlRyPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJ2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5XZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi4kZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlJtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlVmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuZHY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlNyPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9wPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Fdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIiwKbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi52bz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5jZD17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWWY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLlRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5UYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9OwpiLmNlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5TbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iua2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnVkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5uZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuQXY9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9OwpiLiR1PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Vcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbNl07dGhpcy4kbz10aGlzLmFbOF07CnRoaXMubXA9dGhpcy5hWzFdO3RoaXMueW09dGhpcy5hWzNdO3RoaXMuaXA9dGhpcy5hWzhdO3RoaXMuR249dGhpcy5hWzEwXTt0aGlzLnRzPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMuUHI9YjtiLnByb3RvdHlwZT17bnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9yOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubXA6dGhpcy54bShhKX0seG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnltOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pcDp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR246dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5Qcnx8CmphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLm5yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuWmo9YjtiLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxTcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sbGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmxkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMubGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxqYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsKIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamEoKSsiMiJ9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5TcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlpqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkR2PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuWXI9YjtiLnByb3RvdHlwZT17Q3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkR2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuWXJ8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkN2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5qaj1ifSkoYyk7dmFyIEw9Yy5qanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xbz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnlvPWI7Yi5wcm90b3R5cGU9e1ZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlluOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnlvfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Wbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLnRsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5JYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnZ0KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpOjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGNmOmZ1bmN0aW9uKCl7dGhpcy5JYj0KMH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHZ0OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5paCYmTS4kdChiKX0sSHc6ZnVuY3Rpb24oKXtyZXR1cm4gZS55ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LFZxOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy50bHx8cDsoZnVuY3Rpb24oYyl7Yy52bD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPQp0aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5JYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5DYj0iIjt0aGlzLnNnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxJdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LHl0OmZ1bmN0aW9uKGIpe3RoaXMuUGU9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZX0sT2U6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD0KdGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkljKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEdnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGF4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmhxKCl8fHRoaXMuVm0oKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sVm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sCkVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxKZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkNiPWJ9LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2J9LApHaDpmdW5jdGlvbigpe3RoaXMuQ2I9bnVsbH0sTHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkNiJiYoYj0hMCk7cmV0dXJuIGJ9LFd3OmZ1bmN0aW9uKCl7dGhpcy5zZ3x8KHRoaXMuc2c9ITApfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxDdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy52bHx8dDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLk5mPSIxIjt0aGlzLk9mPSIyIjt0aGlzLkttPSIzIjt0aGlzLlBjPTA7dGhpcy5waD0zMDt0aGlzLlJiPVtdO3RoaXMuaGI9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5hZz10aGlzLmdpPQohMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5oZihiKTt0aGlzLnd0KGEpfSxmOmZ1bmN0aW9uKCl7fSxwYTpmdW5jdGlvbigpe3RoaXMuZ2l8fCh0aGlzLmdpPSEwLGUuTWUoKSl9LFRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sTXE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmphKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5qZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuTXEoKTtpZighdGhpcy5TcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5qZigpO3JldHVybn10aGlzLmpmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy4kaCgpO3RoaXMuYWc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMudmEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmhiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSwkaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJgoodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0samY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9mfSxEdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLkttfSxuYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LFRmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSxzdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5PZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUGN9LGhmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnVpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllvPXRoaXMuYVsxXTt0aGlzLkxsPXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLlhsPXRoaXMuYVs2XTt0aGlzLlJ2PXRoaXMuYVs1XTsKdGhpcy5Bbj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLnpqPWI7Yi5wcm90b3R5cGU9e1hvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Zbzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5YbDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnY6dGhpcy56bihhKX0sem46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy56anx8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuWG8oNCk7CihmdW5jdGlvbihjKXtjLkRqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuRGp8fG9hOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLAphPWIudHc7YT9hLm9hP2Eub2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5Fanx8cGE7KGZ1bmN0aW9uKGMpe2MuRmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuRmp8fHFhOyhuZXcgcWEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Mbz10aGlzLmFbNl07CnRoaXMueW49dGhpcy5hWzldO3RoaXMuY3M9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zcD1iO2IucHJvdG90eXBlPXtLbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTG86dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLnNwfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5Lbyg0KTsoZnVuY3Rpb24oYyl7Yy5zaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMueGcoKTt0aGlzLnpnKCk7dGhpcy51bz0hMX0seGc6ZnVuY3Rpb24oKXt0aGlzLmJjPQohMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0semc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpOwphLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5za3x8c2E7KGZ1bmN0aW9uKGMpe2Mucms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMTt0aGlzLmdldFBsYXllcigpOwp2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLndiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy53Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy53Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMud2I9ITApKTp0aGlzLnYoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMucGgmJgohdGhpcy52YSgpJiYodGhpcy53Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudmEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnVvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiYoYS54ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudigib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMudmEoKSYmKHRoaXMud2I/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlNjLmluZGV4T2YoYSkmJgp0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5TYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sR3I6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUWgoYS52aWRlb1RhZyk/YS5iYz90aGlzLnYoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlJjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnhnKCksYS56ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5ya3x8dGE7KGZ1bmN0aW9uKGMpe2MudGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlZxKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmYoKSl9fXRoaXMuVCgpfX0sRXc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5wOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS55YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy50a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzVdfWMudW09YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ObTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudW18fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLk1tKDQpOyhmdW5jdGlvbihjKXtjLmltPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5WKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuaW18fHhhOyhmdW5jdGlvbihjKXtjLmhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPXRoaXMuV2M9ITE7dGhpcy5DaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudGM9dGhpcy5YZz0hMTt0aGlzLlJyKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5zaCgpLHRoaXMuZm8oKSx0aGlzLnJiKCkpfSxScjpmdW5jdGlvbihiKXtyZXR1cm4gZS5BYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwKIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlgsIjsiLHR5cGVvZiBiLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWD9iLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlg/dHlwZW9mIGIuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6CiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KPwp0eXBlb2YgYi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNoKX0semI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJgoodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYj10aGlzLnpiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sS2c6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy56YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxUcTpmdW5jdGlvbigpe2lmKCF0aGlzLldnKXt2YXIgYj0KdGhpcy56YigpLGE9dGhpcy5ScSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuV2c9ITApfXJldHVybiB0aGlzLldnfSxScTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuV2MmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLldjPSEwKTtyZXR1cm4gdGhpcy5XY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuJHMoKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sJHM6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuS2coKTtpZihifHx0aGlzLnZhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0KITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZmEoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxEdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGcmJmIuYWRzJiYodGhpcy5wZz1iLmFkcyk7cmV0dXJuIHRoaXMucGd9LGZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApOwp0aGlzLnMoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLktnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuVHEoKSl7dmFyIGE9dGhpcy56YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnpiKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuemIoKX1lbHNlIHRoaXMuWGc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy56YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6KHRoaXMuZmEoITApLHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSw1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGhvOmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMueWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnljIT1iLmFkcy5zdGF0ZSYmKHRoaXMueWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLnljKXt0aGlzLnYoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMueWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhvKCl9LmJpbmQodGhpcyksMTApfSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxDYTpmdW5jdGlvbigpezA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnZhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sCm9vOmZ1bmN0aW9uKCl7dGhpcy5Nd3x8KDEwPHRoaXMubXY/KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5tdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmd0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9vKCl9LmJpbmQodGhpcyksNTApKSl9LGd0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm52KXt0aGlzLm52PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuaG18fHlhOyhmdW5jdGlvbihjKXtjLmptPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5SaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUmgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUmg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLkljKX19KX0pKGMpO3ZhciB6YT1jLmptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMucHE9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuRnA9YjtiLnByb3RvdHlwZT17QWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FaTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkZwfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuQWooNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxKczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkNiLGg9dGhpcy5rYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7dmFyIENhPWMucWx8fENhOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZWF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIucygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnphKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy50cD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnRwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuSnMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMucGx8fERhOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5tYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLnJsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuZG09dGhpcy5hWzddO3RoaXMuQms9dGhpcy5hWzEwXTt0aGlzLmtuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMubnQ9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG06dGhpcy5BayhhKX0sQWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJrOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT0KYy5udHx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2Mudm4oNCk7KGZ1bmN0aW9uKGMpe2Muams9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuSGcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5Mcz1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0OwpoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkxzKXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuamQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmpkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5qZCl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG5vOmZ1bmN0aW9uKCl7ZS5kaCh0aGlzLmpkKTtlLkZlKHRoaXMuamQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSwKSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmprfHxIYTsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zKCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5pa3x8SWE7KGZ1bmN0aW9uKGMpe2Mua2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuSGcoYiwiZWxlbWVudElEIik7aWYoZS5kaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIEphPWMua2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ebz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLm9sPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMub2x8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkNvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy4kaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT0KYX0seHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLiRqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZmI9YTt0aGlzLkNnPXRoaXMub2k9ITE7dGhpcy50aD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZmI9bmV3IHooYSkpO3ZhciBjPXRoaXMudGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuZmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UueHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmFrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkNnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdHJ5e3RoaXMuU2g/dGhpcy50Yi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMub2l8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy50Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuSWUodGhpcy5mYi51cmwpP2wuTmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5JZSh0aGlzLmZiLnVybCksdGhpcy50aCYmdGhpcy50aCgpfXJldHVybiB0aGlzLnRifX19KShjKTt2YXIgTWE9Yy5ha3x8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPQp0aGlzLldkPSExfWMua2o9YjtiLnByb3RvdHlwZT17QnQ6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxBdDpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGV0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17YXc6IkFkQ2xpY2tUaHJ1IixjdzoiQWRFcnJvciIsZHc6IkFkU3RvcHBlZCIsZ3c6IkFkTGluZWFyQ2hhbmdlIixodzoiQWRUYWdQYXJzZWQiLGx3OiJBZFZpZGVvQ29tcGxldGUiLHB3OiJBZExvYWRlZCIscXc6IkFkU2tpcHBlZCIscnc6IkFkU3RhcnRlZCIsZXc6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdzoiQWRJbXByZXNzaW9uIixidzoiQWRDcmVhdGl2ZVZpZXciLGl3OiJBZFZpZGVvTWlkcG9pbnQiLGt3OiJBZFBhdXNlZCIsCm53OiJBZFZpZGVvU3RhcnQiLG93OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGR0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5WZClmb3IodmFyIGIgaW4gdGhpcy5GYS5WZCl0aGlzLkZhLlZkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5WZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYS5nZXRFcnJvcigpOwphJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuZXQoKTt0aGlzLkZhJiZ0aGlzLmR0KCl9fX0pKGMpO3ZhciBOYT1jLmtqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmplPXRoaXMudmM9dGhpcy54Yj1udWxsO3RoaXMuSG89dGhpcy5KYj10aGlzLmtoPSExO3RoaXMuSmE9IiI7dGhpcy5maD0hMTt0aGlzLnVhPXRoaXMub2Q9IiI7dGhpcy5haD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLkJhPVtdO3RoaXMuUWc9dGhpcy5mYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuS2Q9W107dGhpcy5nYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRGM9ITE7dGhpcy5wbz10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLmxjPXRoaXMudWc9dGhpcy53Zj10aGlzLk5kPXRoaXMubGU9dGhpcy5RYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnBkPTA7dGhpcy5TZz0hMTt0aGlzLlJnPTFFMzt0aGlzLlljPSExO3RoaXMuUWE9MUUzO3RoaXMuUWY9IiJ9Yy5iaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLndjLGFkdGFnbW9kaWZpZXI6dGhpcy54YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMudmMsCmFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5raCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5Ibyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLmZoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLnVhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5haCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5mYyxob21hZEFkcGF0aDp0aGlzLlFnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5JZixIT01BRF9CTE9DS0VEOnRoaXMuR2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMubmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLkhmLHRlc3RIaWRlOnRoaXMuaGMsdGVzdFRhZ3M6dGhpcy5pYyx0ZXN0VGFnc0pTOnRoaXMuamMsCnRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLnBvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubGMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5ZYyxhZEZhbGxiYWNrVVJMOnRoaXMuUWZ9fSxmcTpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYKMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLlFuKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLndhKGEpO2Y/KHRoaXMucmQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuQmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy53Y3x8dGhpcy54Ynx8dGhpcy52Y3x8dGhpcy5qZSkmJihnPXRoaXMuTXIoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5QcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHJkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sUHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIueXc7cmV0dXJuIm5vbmUifSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuS2hdfSxCZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMucWQoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0scWg6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS53YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucWgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLnFoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LE1yOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLnhiKWZvcih2YXIgYiBpbiB0aGlzLnhiKXRoaXMueGIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueGJbYl0pKTt0aGlzLnZjJiYoYT10aGlzLkxyKGEsdGhpcy52YykpO3JldHVybiBhfSxtbzpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5pbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxpbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuQnQoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkF0KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLmZoPSEwO3RoaXMub2Q9YTt0aGlzLnVhPWI7dGhpcy5hZj0KZDt0aGlzLlBkPWY7dGhpcy56Yz1jO3RoaXMuRGE9ZXx8e307dGhpcy5tbygpO3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy5BcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9Yix0aGlzLnhjKCl9Y2F0Y2goayl7dGhpcy5oYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy5vZCt0aGlzLmdlKCJnbG9iYWwiKSksdGhpcy5jcS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiZ2xvYmFsIik7CiJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sQXI6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMudWErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5EYSYmdGhpcy5EYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRGEmJnRoaXMuRGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9CndpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuemM9ITEpO3RoaXMuemMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy56Yz90aGlzLnpjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlk9dGhpcy5haD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5HZikpO3RoaXMuTmIoKTtlLkFjKGsuRHMpOyhiPWUuQ2ModGhpcy5xZCgpKSl8fChiPWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGNxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPQp0aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZmN8fHRoaXMuSmF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy51YX1lbHNlIGE9dGhpcy51YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7CnRoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLlFnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQmEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5mYyYmdGhpcy5KYSYmdGhpcy5CYS5sZW5ndGg/dGhpcy5GYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX0sRmM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5CZCgpKSxkPXRoaXMud2EodGhpcy5mYyk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5mYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5jdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuT2w/dGhpcy5oYSgibm9TVk1Db25maWciKToodGhpcy5PbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuRmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGN1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuRGM9ITA7dGhpcy5GYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuTWIoYi5zdHJpY3QpO3RoaXMud2Y9dGhpcy5NYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy51Zz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5oYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmpjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLndjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMueGI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMudmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmplPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmtoPWIuanNwb3B1cHN8fCExO3RoaXMuSmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMubGM9Yi52cGFpZHx8ITE7dGhpcy5EYS52cGFpZD10aGlzLmxjO3RoaXMuTmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5aYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMubGk9Yi52bWFwc3x8IiI7dGhpcy5ZYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUWE9CmIuYml0cmF0ZXx8MUUzO3RoaXMuUWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuZ2M9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5XcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmdjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuRGM9ITAsdGhpcy5GYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5KdSgpJiYodGhpcy5oY3x8dGhpcy5qY3x8dGhpcy5pY3x8dGhpcy5nY3x8dGhpcy5LZCk/dGhpcy5hZj8odGhpcy5VYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLm5lKCksdGhpcy5OYigpKTp0aGlzLm11KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubnUoKSl9fSwKbXU6ZnVuY3Rpb24oKXt0aGlzLmx1KCk7dGhpcy5vdSgpfSxvdTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmFhKDEwKSxnPWUuYWEoMTApLEg9ZS5hYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS55YihhKGMpKSsKYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5oZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5EYSYmdGhpcy5EYS5wbGF5ZXImJnRoaXMuRGEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7cmV0dXJufXRoaXMuaGEoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG51OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpfSxNYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLlVhPSEwLApkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxsdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmpoKCkpdGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5pYz10aGlzLktkKSYmdGhpcy5pYy5sZW5ndGgpe3ZhciBkPXRoaXMuaWMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5wZigpfSxydTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuS2EobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuc3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmpjJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LHN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0scGY6ZnVuY3Rpb24oKXt0aGlzLmdjPyh0aGlzLnNmKyssdGhpcy5LYShuZXcgeih0aGlzLmdjKSx0aGlzLmt1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuVGgoKX0scWY6ZnVuY3Rpb24oYSl7dGhpcy5NYyh0aGlzLkhmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIisKYSl9LGt1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKTt0aGlzLm5lKCl9LGpoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sTmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVmEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLAphKyIiK2IsITApOyIxIj09PWImJihlLkFhKCJ0LW9ubGluZS5kZSIpfHxlLkFhKCJnaWdhLmRlIil8fGUuQWEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuamgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSWYpKTt0aGlzLlBkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUGQmJnRoaXMuUGQoKX0sbG86ZnVuY3Rpb24oKXtpZih0aGlzLndmJiZ0aGlzLmZxKCkpe3ZhciBhPXRoaXMuT3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LCRoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMucGR8fAoodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlJnJiYhdGhpcy5TZyYmKHRoaXMuU2c9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlJnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLm9pPSEwKTtjJiZlLldxKCkmJihhLkNnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxqbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMucmQoKXx8KGE9dGhpcy53YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxqdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0sa286ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdi5iaW5kKHRoaXMpLHRoaXMuYnYuYmluZCh0aGlzKSl9LGN2OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMucHAoKX0sYnY6ZnVuY3Rpb24oKXt9LHBwOmZ1bmN0aW9uKCl7ZS5BYyhrLm9wKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5KYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSxKdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHliOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmJrfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaT10aGlzLmFbNV07dGhpcy5rcT10aGlzLmFbM107dGhpcy5DaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbOV07dGhpcy53cT10aGlzLmFbMV07dGhpcy56az10aGlzLmFbM107dGhpcy5BbT10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy5Jdj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5ycj1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTGk6dGhpcy5qcShhKX0sCmpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ2k6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy55ayhhKX0seWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnprOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BbTp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudWo6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMucnJ8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmcuUD90aGlzLmJiPWEuZy5QKCk6dGhpcy5iYj0iIjthLmcuWmcmJmEuZy5aZyh7cGF1c2U6dGhpcy54ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuWHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZzt0aGlzLlZiPXRoaXMuWGM9ITE7dGhpcy5Obj0xRTM7dGhpcy5yYT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlduPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlZjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmCih0aGlzLlZjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5nKSYmdGhpcy5iLmcudSYmKGE9dGhpcy5iLmcudSgpKSx0aGlzLlZjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudWg9dGhpcy5HZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy53bz1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5lZD10aGlzLm9mPXRoaXMuc2I9dGhpcy5tYz0KdGhpcy53aD10aGlzLmtkPXRoaXMuTXU9dGhpcy52Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLnlzPTIwMDt0aGlzLkRmPXRoaXMuRWY9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy53ZD17fX1jLldqPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLiRiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5JZCgiY2FsbCIsdGhpcy5aYSgpKTtlLncoay5UbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxMZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnZiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihnPSEwKTtpZih0aGlzLkwuWSl0aGlzLm1mKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5MLmxvKCksYz1sLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm5oLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5sYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmcuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZy5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5MZShhLGIsZCl9LDUwKX19LFdlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5RZD10aGlzLk9iPXRoaXMua2Q9ITE7dGhpcy5jPWE7dGhpcy5HdCh0aGlzLmMpO3RoaXMud2Q9bmV3IFFhKHRoaXMuYy5ndix0aGlzLnZpZGVvLHt9KTt0aGlzLk5nKGEpO3RoaXMucmM9dGhpcy5FZyhhKTt0aGlzLnFvKCl9LE5nOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkhkPXRoaXMuWnAoYSkpLHRoaXMuTmcoYS5wYXJlbnQpKX0sRWc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZgpifHwoYz10aGlzLkVnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnAoYSkpKTtyZXR1cm4gY30sSnA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuWGQuY29kZT9lLncoay5Cdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLk1lKCksYj09Ri5MZi5jb2RlJiZlLncoay5Tcix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5ucCx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuSWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkpmLmNvZGU6ZS53KGsuZHYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5NZi5jb2RlOmUudyhrLkV2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LllkLmNvZGU6ZS53KGsuSnYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpOwpicmVhaztjYXNlIHcuVWQuY29kZTplLncoay5Ucix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLncoay4kdSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRmYuY29kZTplLncoay5hdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuS2UoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LApHdDpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuWXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5ibiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5YbShiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuSWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuJG0oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuc28oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkV0KCkpOnRoaXMuYy5vcmlnaW4udmcody5VZCl9LEV0OmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnNiPXRoaXMubWM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5uZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMuc2I9ITApO2Uub2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnRhJiZlLmFuKHRoaXMuYy5vcmlnaW4udGEpO2UuZ2IoInNldFVwVnBhaWQiKTt0aGlzLklkKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnhoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuYnEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZWcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnJjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMucHYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5xdigpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9CiEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy51digpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMueXYoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMud3YoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMueHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy56digpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy52digpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5taSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsubWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLlljJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnR2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5jZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5FZiYmCih0aGlzLkRmPSExLHRoaXMuZWMoKSksdGhpcy5zdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMuc2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLnZmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5iZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sc3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubWM9ITF9LHV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHF2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZ2IoImltcHJlc3Npb24iKTt0aGlzLlBoKCk7ZS53KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZ2IoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx3djpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO2UuZ2IoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LHh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmdiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5nYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx2djpmdW5jdGlvbigpe3RoaXMueWYoKTtlLmdiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LG1pOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZ2IoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxwdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmdiKCJlcnIiLGIpO2UudyhrLkF2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5taSghMCl9LFhtOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5yZCgpKXt2YXIgZD1iLndhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubHYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5ObikpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5YYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlhjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC51Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuaHYoKTt0aGlzLmhpKCk7dGhpcy5mZygpO3RoaXMuYi54aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlNmKCl9LFNmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5TZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLlJtLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSxVbTpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjwKYS5sZW5ndGg7ZisrKWM9ZS5JZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLld0KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5SZCYmdGhpcy5VbSh0aGlzLmMuUmQpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5RZHx8KGUudyhrLlZyLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnVifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLlZiPXRoaXMuWGM9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5vZj0KITA7dGhpcy5iLkJlKCk7dGhpcy5hYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudWImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucmgoKTp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxsdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5qbygpO3RoaXMuYy5vcmlnaW4udmcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5NdSl0aGlzLlJhKCk7CmVsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZy5MYSYmIXRoaXMub2YmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmNkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlJ1KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YiwKcGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnViPyh0aGlzLlZiPXRoaXMuWGM9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6CnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy53aHx8KHRoaXMud2g9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFJ1OmZ1bmN0aW9uKGEpe2UudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZiKSx0aGlzLnZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5QaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlVmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLlJmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYKKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmNpPWEpfSxJZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sUGg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHwKdGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMud2QmJnRoaXMud2QudHJhY2smJnRoaXMud2QudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuJHAodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkhkLmltcHJlc3Npb25zJiZlLlVxKGcudXJsLHRoaXMuSGQuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsCmcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5TbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLkZvKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuRWYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5XbShjKSxmfHwoZj10aGlzLnRnKSxlfHwoZT10aGlzLnRnKSx0aGlzLlltKGEpLHRoaXMuTC5LYShiLApmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LHFvOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sWnQ6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sJHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxGbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuanYuYmluZCh0aGlzKSl9LApqdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLncoay5tZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWWMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOgooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuWmMmJihiPXRoaXMuTC5aYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5BYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LApBYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLndvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0KIkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksCmcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk91LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTnUuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkJiKCk7dGhpcy5BYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksCmwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSksCnRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5CYigpO3RoaXMuQWIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy54YSYmKHRoaXMueGEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmJnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsubmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlFlKCkpO3RoaXMuQmIoKX19LEJiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx4ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLlRjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LE91OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFh1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5RYyl8fHRoaXMudWg/KHRoaXMuZWQ9ITAsdGhpcy52YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52YiksdGhpcy52Yj0hMSksdGhpcy5vZygpKToodGhpcy51aD10aGlzLkVmPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZWcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuWnQoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnlzKToodGhpcy5vZj0hMCx0aGlzLmIuQmUoKSx0aGlzLmIuaXQoKSx0aGlzLmFjPSExLGUudyhrLnZvLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy54ZSgpLkdoKCkpfSwKeGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sZmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnhkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuV24rIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSmcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkpnKCkpO3JldHVybiBhfSx0ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuV2p8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLnl1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMubG49YjtiLnByb3RvdHlwZT17RHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkVxOnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55dTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMubG58fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsCm5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5EcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkVhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMucWM9dGhpcy5zYz0hMTt0aGlzLnRhPSIiO3RoaXMuQmY9ITE7dGhpcy5VZz0iIjtkJiZkLmVtcHR5P3RoaXMuRnIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5lbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5oZCgpLGI7Yj1lLndhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTsKYj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC55YShsLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucWcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuSmQoYSkpKyImdHlwZT1qcyIsYj1sLnlhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwueWEobC5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS4kYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuJGJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLiRifHx0aGlzLlpxKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLmp1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LFpxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sRXI6ZnVuY3Rpb24oYSl7dGhpcy5TcyhhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5VZz1hLnJlc3BvbnNlVVJMO3RoaXMuWC5sZW5ndGg/dGhpcy5IYygpOnRoaXMucWEodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLkJmP0YuWGQ6CkYuS2Z9KSl9LEZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5YLmxlbmd0aD90aGlzLkhjKCk6dGhpcy5xYSh0aGlzLlNhKHcuT2Mse2Vycm9yOnRoaXMuQmY/Ri5YZDpGLktmfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5TYSh3LkpmLHtkZXB0aDphfSkpfSxIYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLmFyKCk/dGhpcy50dSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLk9nKCksaCx7QWRTeXN0ZW06dGhpcy5JcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnFhKHRoaXMuU2Eody5NZikpOihhPTAsdGhpcy5ZdSgpJiZ0aGlzLldlKHRoaXMueG8oKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMuc2M/Cih0aGlzLnNjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkhjKCkpOnRoaXMucGFyZW50LlJlKCl9LHJoOmZ1bmN0aW9uKCl7dGhpcy5xYz8odGhpcy5xYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5IYygpKTp0aGlzLnBhcmVudC5yaCgpfSxZdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1KCk/dGhpcy5wdSgpPyEwOigtMSE9dGhpcy5CYygpP3RoaXMucWEodGhpcy5TYSh3LlRkKSk6dGhpcy5xYSh0aGlzLlNhKHcuRmYpKSwhMSk6KHRoaXMucWEodGhpcy5TYSh3Lk9jLEYuTGYpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVWcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5OZSgpKTthLnViPWEudWI/YS51Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5CZzt0aGlzLnBhcmVudC5XZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5CYygpO2EuTz10aGlzLkxnKCk7YS5VYj10aGlzLktwKCk7YS5ndj1bXTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkhwKCk7YS5sZj10aGlzLllwKGEuZHVyYXRpb24pO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYil7dGhpcy50YXx8KHRoaXMudGE9IiIpO2IuJGE9Yi4kYT9iLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHAoKSk6Yi5QYS5jb25jYXQodGhpcy5UcCgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LldiJiZ0aGlzLnBhcmVudC5XYihiKSxhPTAsdGhpcy5IYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGIpLGE9MCl9LFdiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LldiKGEpfSx2ZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx0dTpmdW5jdGlvbigpe3JldHVybiBhPGh9LHF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5MZygpLmxlbmd0aH0scHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkJjKCl9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LFNzOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxhcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2coKS5sZW5ndGh9LE9nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sSXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmJoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5iaChhLnBhcmVudE5vZGUpOiExfSxUcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxMcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCkxnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHp3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxIcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLm5kKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxCYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFlwOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVnQoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuZW18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR209dGhpcy5hWzFdO3RoaXMuVnU9dGhpcy5hWzddO3RoaXMubXQ9dGhpcy5hWzhdO3RoaXMuUHE9dGhpcy5hWzZdO3RoaXMuQ249dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMV19Yy5Sbj1iO2IucHJvdG90eXBlPXtGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMubHQoYSl9LGx0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUHE6CnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dbjp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlJufHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5GbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQT10aGlzLnBjPXRoaXMudWI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5zbD1iO2IucHJvdG90eXBlPXtzbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxScDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRWEpe3ZhciBhPXRoaXMub3JpZ2luLkVhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxKZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5ScCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sYnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLnNsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbNl07dGhpcy55aT10aGlzLmFbOF07dGhpcy5jcj0KdGhpcy5hWzRdO3RoaXMub209dGhpcy5hWzddO3RoaXMubWo9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNV19Yy5Fbz1iO2IucHJvdG90eXBlPXtIbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW06dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Fb3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuSG0oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsCmNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE9hOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LE1mOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSwKSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxadjp7dHlwZToiZXJyb3IiLApjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtLZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxMZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSwkdjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbN107dGhpcy5icD10aGlzLmFbMl07dGhpcy5ucz10aGlzLmFbN107dGhpcy5Taj10aGlzLmFbNF07dGhpcy5BaT10aGlzLmFbNl07dGhpcy55cT10aGlzLmFbMl07dGhpcy5LdD10aGlzLmFbMV07dGhpcy5pcj10aGlzLmFbNV07dGhpcy5JdD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLkVtPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52czp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYnA6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tajp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWk6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlxOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLkt0OnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pcjp0aGlzLkh0KGEpfSxIdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkVtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy51cyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuQ2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DcT10aGlzLmFbNF07CnRoaXMudXE9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzNdfWMuSXM9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNxOnRoaXMudHEoYSl9LHRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51cTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuSXN8fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkJxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLk9kPVtdO3RoaXMuRWg9W107dGhpcy5TZT1bXTt0aGlzLmt2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7CnRoaXMuTSgpfWMuTWs9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtlLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGc9ZS5jb250ZW50V2luZG93O2cuVXc9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuZnQuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuWHMuYmluZCh0aGlzKX07dmFyIGs9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmsub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtnLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7dGhpcy5PZC5wdXNoKHtzcmM6YyxmcmFtZTplLENzOmYsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlNlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuU2VbYl07Yy50eXBlPT09YSYmYy4kbih0aGlzLk1wKGEpKX19LE1wOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e2N4OiEwLGJ4OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e1F3OiJ2aWRlbyIsZXg6ImpzQ3VzdG9tIixmeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxneDoxLEF3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sYXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLk9kLmxlbmd0aDtiKyspaWYodGhpcy5PZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLk9kW2JdLkNzO3JldHVybiIifSxmdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuYXEoYiksdmVuZG9yOmJ9KTsKdGhpcy5YdCgpfSxYczpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMua3YubWFwKGZ1bmN0aW9uKGEpe3RoaXMuY2coYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5jZyhhLGIpfSxjZzpmdW5jdGlvbihhLGIpe3RoaXMuU2UucHVzaCh7dHlwZTphLCRuOmIsJHc6ITF9KX0sWHQ6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLlhxfHwoYS5Udyh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuZHgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLlhxPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO3ZhciBRYT1jLk1rfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kaz10aGlzLmFbMTBdO3RoaXMuTmw9dGhpcy5hWzNdO3RoaXMuTHY9CnRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLnBqPXRoaXMuYVs5XTt0aGlzLmtyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzddfWMuRmk9YjtiLnByb3RvdHlwZT17Wms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRrOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ObDp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTHY6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhrOnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLkZpfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuWmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5nPWE7dGhpcy5qYj1hLkdnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuZGc9ITE7dGhpcy5UYj1bXX1jLm5qPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYsCnk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5pcShhKSxnPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtnPXt4OmIseTpjfTtmJiYoZy5wb3NpdGlvbj1mKTtyZXR1cm4gZ30sYnU6ZnVuY3Rpb24oKXt0aGlzLmRnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0seGg6ZnVuY3Rpb24oKXt0aGlzLmcucGF1c2UoKTtlLncoay5jZCx0aGlzLmcudSgpKX0saXQ6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5nLnBsYXkoKSxlLncoay5kZCx0aGlzLmcudSgpKSl9LGtmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuamIpO3RoaXMuZy5KYyYmdGhpcy5nLkpjKCk/dGhpcy5nLkdnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sCmlxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx4cDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueHAodGhpcy5qYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5nLkpjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5RaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxiZzpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMubmp8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLll2PXRoaXMuYVs2XTt0aGlzLmdwPXRoaXMuYVs2XTt0aGlzLk10PXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLndqPXRoaXMuYVs5XTt0aGlzLndpPXRoaXMuYVs5XTt0aGlzLlNpPXRoaXMuYVs3XTt0aGlzLnpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLkJzPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnY6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLll2OnRoaXMuZnAoYSl9LGZwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncDp0aGlzLkx0KGEpfSxMdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXQ6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJzOgp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLndpOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Cc3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuTXYoNCk7KGZ1bmN0aW9uKGMpe2Muamw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwKKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5EZChiKTt0aGlzLnJnKCl9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxyZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiYKYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5qbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuaWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlZmPXRoaXMuWGY9CnRoaXMuWWc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMudXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWWcmJnRoaXMubGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYWQoKTt0aGlzLllnPSEwO3RoaXMubGcoKX0uYmluZCh0aGlzKSk7CnRoaXMuaGcoKX0sbGc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5hZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5hZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVmYmJiF0aGlzLlhmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0sYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE1nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGhnOmZ1bmN0aW9uKCl7aWYodGhpcy5hZCgpKXt2YXIgYj0KdGhpcy5NZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlhmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVmY9Yi54d310aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLk93KCk6ITF9LEJjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5CYygpOi0xfSxVcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx1cDpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMucygiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCl9LmJpbmQodGhpcyksMTAwKX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlVwKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuaWx8fGRiOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWXE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ud2wuTG0uSm0/d2luZG93Lk9PLndsLkxtLkptLnZ3KGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZcSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMua2x8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jcj10aGlzLmFbNV07dGhpcy5xaz10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbMl07dGhpcy5qPQp0aGlzLmFbOF19Yy5Jaz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXI6dGhpcy5wayhhKX0scGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFrOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuSWt8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkhyKDQpOyhmdW5jdGlvbihjKXtjLmFqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5QZygpfSxQZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7CmJ8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlYoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LApOYTpmdW5jdGlvbigpe3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlcmJigwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLmFqfHxoYjsoZnVuY3Rpb24oYyl7Yy4kaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxpZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnYoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnBhKCk6dGhpcy5tKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5pZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmlnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LERoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwKKGIuRGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudnB8fCh0aGlzLnZwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5EaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuRGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixUPW5ldyBqYihyKTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRW49dGhpcy5hWzVdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuR2s9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsyXTt0aGlzLm1rPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLnlsPXRoaXMuYVs0XTt0aGlzLmV1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuT289YjtiLnByb3RvdHlwZT17RG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVuOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kajp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxqOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHI6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlsOnRoaXMuZHUoYSl9LApkdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmV1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Pb3x8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuRG4oNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSmM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLlVsfHxVOyhmdW5jdGlvbihjKXtjLlRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuVWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnYuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTsKeS5VYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmFzKGEpfS5iaW5kKHRoaXMpKTt5LlVjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuVWMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LmVxKCl9LGFzOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudigpO3RoaXMucGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwKMTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLnYoKTt0aGlzLnBhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5UbHx8VjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy52ZCYmKGI9ZS5HbyhiLHRoaXMudmQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7CnZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmYoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy52ZHx8KHRoaXMudmQ9W10pLHRoaXMudmQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFVjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LHV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuR2N8fAoodGhpcy5HYz1bXSksdGhpcy5HYy5wdXNoKGIpLHRoaXMuaHQoKSYmKHRoaXMuY2YoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sZXE6ZnVuY3Rpb24oKXtpZih0aGlzLkdjKWZvcih2YXIgYj0wO2I8dGhpcy5HYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkdjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPQpiLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkudXUoYil9fSl9KShjKTt2YXIgbGI9Yy5WbHx8bGIseT1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbMl07dGhpcy5rdD10aGlzLmFbNF07dGhpcy5tcj10aGlzLmFbNl07dGhpcy52az10aGlzLmFbMV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5JdT10aGlzLmFbOF07dGhpcy5DdT10aGlzLmFbOF07dGhpcy5Waz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkZxPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ncjp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1yOnRoaXMudWsoYSl9LAp1azpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudms6dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkF1OnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5JdTp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3U6dGhpcy5VayhhKX0sVWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5GcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnYoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpOwphLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuWWl8fG9iOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgbmIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgb2IoZSx0aGlzLkkpKS5mKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9CmIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuWml8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Uaz10aGlzLmFbNl07dGhpcy5Bcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnVyPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ubjp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGo6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vazoKdGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5pOnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Uazp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLnVyfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5tbig0KTsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuV3ModGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sV3M6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWmc6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5Ya3x8c2I7KGZ1bmN0aW9uKGMpe2MuV2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5pPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm5hKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLldrfHx0YjsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5JKSkuZigpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpO3ZhciB1Yj1jLllrfHx1YixXPW5ldyB1YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucnA9dGhpcy5hWzRdO3RoaXMua3A9dGhpcy5hWzNdO3RoaXMuRHA9dGhpcy5hWzddO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuaWo9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuaWp8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnFwKDQpOyhmdW5jdGlvbihjKXtjLmxtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLmxtfHx3YjsoZnVuY3Rpb24oYyl7Yy5rbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sVXM6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE/dGhpcy5Vcyh0aGlzLnphKToodGhpcy56YT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuemEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmCnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5lYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5lYlthXSYmMzAzIT10aGlzLmViW2FdJiY0MDMhPXRoaXMuZWJbYV0mJihiPSExKTtpZihiKXRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLmttfHx4YjsoZnVuY3Rpb24oYyl7Yy5tbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5JKSkuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLm1tfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnE9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuaGs9YjtiLnByb3RvdHlwZT17SXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuaGt8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLklxKDQpOyhmdW5jdGlvbihjKXtjLklsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVihiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuS3MoKX0uYmluZCh0aGlzKSw1MDApfSxLczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFl0OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Lcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Lcj8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWXQoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLkhsfHxDYjsoZnVuY3Rpb24oYyl7Yy5KbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuSmx8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdT10aGlzLmFbMV07dGhpcy5mdj10aGlzLmFbNV07CnRoaXMuZXM9dGhpcy5hWzZdO3RoaXMuTHE9dGhpcy5hWzJdO3RoaXMucW49dGhpcy5hWzEwXTt0aGlzLlFvPXRoaXMuYVs0XTt0aGlzLmxzPXRoaXMuYVs5XTt0aGlzLndtPXRoaXMuYVszXTt0aGlzLmpzPXRoaXMuYVsxMF07dGhpcy5XaT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs2XX1jLmRqPWI7Yi5wcm90b3R5cGU9e0t1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmVzOnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5McTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucW46dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Rbzp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy52bShhKX0sCnZtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53bTp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpzOnRoaXMuVmkoYSl9LFZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuZGp8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLkt1KDQpOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7CnZhciBHYj1jLkRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMudnIoKTp0aGlzLmtnKCk7Yi5hdXRvcGxheSYmCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHRvOmZ1bmN0aW9uKCl7dGhpcy5UZigpfHx0aGlzLm0oITApfSx2cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5vYSYmYi5YJiZiLnV3JiZiLnd3JiYodGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2coKX0uYmluZCh0aGlzKSwxMDApfSxtZDpmdW5jdGlvbigpe2lmKCF0aGlzLnZoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy52aD1iW2NdKTtyZXR1cm4gdGhpcy52aH0sUHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5DbHx8SGI7KGZ1bmN0aW9uKGMpe2MuRWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmYoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLkVsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzFdO3RoaXMuSGk9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs5XTt0aGlzLmVyPXRoaXMuYVsxXTt0aGlzLm1xPXRoaXMuYVs1XTt0aGlzLml1PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMud3A9CmI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5obDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5IaTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3I6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMubHEoYSl9LGxxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tcTp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLndwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5nbCg0KTsKKGZ1bmN0aW9uKGMpe2MuS2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5WKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxOdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxKYzpmdW5jdGlvbigpe3JldHVybiEwfSxJYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuS2t8fFg7KGZ1bmN0aW9uKGMpe2MuSms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLlZ3KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmt8fFk7KGZ1bmN0aW9uKGMpe2MuTGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5mKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5tYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBHLExiPWMuTGt8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuZ3U9dGhpcy5hWzJdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzNdO3RoaXMuV3Y9dGhpcy5hWzEwXTt0aGlzLmZqPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLld1PWI7Yi5wcm90b3R5cGU9e2ZzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nczp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3U6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbzp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmo6dGhpcy5WdihhKX0sVnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLld2OnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuV3V8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLmZzKDQpOyhmdW5jdGlvbihjKXtjLlVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksCmEmJmM/KHRoaXMuVihjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LExhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxTdzpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlVqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Uaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlRqfHxQYjsoZnVuY3Rpb24oYyl7Yy5Waj0KcC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmd2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMoKTtpZihiJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5tYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5mKCkpfX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlZqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Y9dGhpcy5hWzJdO3RoaXMuZm49dGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzhdO3RoaXMueWo9dGhpcy5hWzNdOwp0aGlzLlJzPXRoaXMuYVs4XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs1XX1jLmVrPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hdjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZm46dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLktuOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJzOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmVrfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuQ209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVihhKX1lbHNlIHRoaXMuY2EoKX0sTWQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSwKZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxWczpmdW5jdGlvbigpe3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuU2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlNkfHwodGhpcy5TZD0hMCx0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKTGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLkNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5CbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxaczpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSl9LCRjOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMucygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxQZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPQowO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuJGMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlBmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuWnMod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5QZigpO3RoaXMuWXMoKX0sWXM6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuVHM/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5Ucz0KITB9fSl9KShjKTt2YXIgVWI9Yy5CbXx8VWI7KGZ1bmN0aW9uKGMpe2MuRG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5WcygpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMuRG18fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJHI9dGhpcy5hWzldO3RoaXMuUmw9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOV19Yy5zcT1iO2IucHJvdG90eXBlPXtacjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLiRyOnRoaXMuUWwoYSl9LFFsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuc3F8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLlpyKDQpOyhmdW5jdGlvbihjKXtjLmFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLApiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Rcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnloJiYodGhpcy55aD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMuYW18fE87KGZ1bmN0aW9uKGMpe2MuJGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0semE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5EdCgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuJGx8fFA7KGZ1bmN0aW9uKGMpe2MuYm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLk5rPWI7Yi5wcm90b3R5cGU9e09pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuTmt8fCRiLFhjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLk9pKDQpOyhmdW5jdGlvbihjKXtjLkRrPQp0LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVihhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuQ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmc9MDt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPQp0aGlzLldjPSExO3RoaXMuQ2g9ZS5IYigxMCk7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlZnKys7aWYoMTA8dGhpcy5WZyl0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5tKCEwKTp0aGlzLm0oKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVoLmJpbmQodGhpcyksMTAwKSwhMX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudmEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Da3x8YWE7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgYWM9Yy5Fa3x8YWMsYmM9bmV3IGFjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5CcD10aGlzLmFbMTBdO3RoaXMudHI9dGhpcy5hWzldO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLmJvPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5Qaz10aGlzLmFbN107dGhpcy5Icz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5zaj1iO2IucHJvdG90eXBlPXtBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50cjp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSmk6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xdDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUGs6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2p8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFwKDQpOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7CnZhciBkYz1jLlBqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Paj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qZygpfSxqZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuT2p8fGVjOyhmdW5jdGlvbihjKXtjLlFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsKKG5ldyBlYyhiLHRoaXMuSSkpLmYoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuUWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbj10aGlzLmFbNl07dGhpcy5naz10aGlzLmFbOV07dGhpcy5CbD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbMV07dGhpcy5xcj10aGlzLmFbNV07dGhpcy5Gcz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLlNsPWI7Yi5wcm90b3R5cGU9e2NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kbjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ2s6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJsOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Cbzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLnFyOnRoaXMuRXMoYSl9LEVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuU2x8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmNuKDQpOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5yaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5tZSgpO3RoaXMuZ2coKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSwKZ2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9LG1lOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fApiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMucGl8fGpjOyhmdW5jdGlvbihjKXtjLnNpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMuc2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ycT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmZsPWI7Yi5wcm90b3R5cGU9e3FxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuZmx8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnFxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmdoPXRoaXMuaWg9dGhpcy5oaD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjPwpudWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj8KbnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLnVsPWI7Yi5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuVnAoYSk6W10sYjt0aGlzLmloPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmhoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5naClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYKYSBpbnN0YW5jZW9mIHA/ITA6ITF9LFZwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LCR0OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiB0JiYhdGhpcy5oaClmb3IodGhpcy5naD0hMCxhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnlkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMudWx8fG5jLE09bmV3IG5jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNvPXRoaXMuYVs3XTt0aGlzLlF1PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVs3XTt0aGlzLmhuPQp0aGlzLmFbNl07dGhpcy5TdD10aGlzLmFbMV07dGhpcy5Wbj10aGlzLmFbOV07dGhpcy53dT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLnJvPWI7Yi5wcm90b3R5cGU9e1JvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tbzp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUXU6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5objp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZuOnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5yb3x8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlJvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkFjKGsuWnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkFjKGsuVXIpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsCiIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmphKCk7SS4kZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuamEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLiRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5qYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2UuQWcod2luZG93LEkuTnEoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTsKZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbN107dGhpcy5nbT10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbNV07dGhpcy5Qdj10aGlzLmFbNF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzddO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy56bD1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Sazp0aGlzLk92KGEpfSxPdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHY6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy54cjp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5vOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2w6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy56bHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnpoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy50ZD0wOwp0aGlzLmJiPSIiO3RoaXMuemQ9W107dGhpcy5BZD0wO3RoaXMuQmg9ITE7dGhpcy5aZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXt0aGlzLnpoPWF9LGhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdXQ6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx0dDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxLYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5RcSgpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIudWEsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuS2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLnpjKTtlbHNlIGlmKHRoaXMuZ3EoKSl0aGlzLm90KGZ1bmN0aW9uKCl7dGhpcy5LYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuY2QsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLApnKTtsLnN0KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5KcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkplJiYoYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnRkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudGQuZ2V0VGltZSgpLHRoaXMudGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnRkPWE7cmV0dXJuITF9LFV0OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMud2coYSkpP3RoaXMuS2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5kZCx0aGlzLnBsYXllci51KCkpKX0sVHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuemgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLnp0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLndnKGMpKT90aGlzLktjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5kZCx0aGlzLnBsYXllci51KCkpKX19LHdnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxidDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkZ0KHRoaXMuVHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5vaCl7dGhpcy5vaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5LYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5kZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxhdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnl0KHRoaXMuRmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuT2UoKX0sZjpmdW5jdGlvbigpe3RoaXMuVXQoKTt0aGlzLnBsYXllci5PZSYmdGhpcy5hdCgpO3RoaXMuYnQoKX0sY3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy56ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuVXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkFkPXRoaXMuemQubGVuZ3RofSxncTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5BZCYmKGE9ITApO3JldHVybiBhfSwKb3Q6ZnVuY3Rpb24oYSl7dGhpcy5CaD1hO2ZvcihhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXVsiZnVuY3Rpb24iXSh0aGlzLk9zLmJpbmQodGhpcykpfSxPczpmdW5jdGlvbihhKXt0aGlzLkFkLS07YSYmdGhpcy5aZS5wdXNoKGEpOzA+PXRoaXMuQWQmJnRoaXMuQmgoKX0sSnI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWmUubGVuZ3RoO2MrKyliPXRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUXQ9dGhpcy5hWzZdO3RoaXMucW09dGhpcy5hWzZdO3RoaXMuQXE9dGhpcy5hWzFdO3RoaXMuZXA9dGhpcy5hWzddO3RoaXMuSm89dGhpcy5hWzRdO3RoaXMuT3Q9dGhpcy5hWzVdO3RoaXMuYmw9CnRoaXMuYVs4XTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuUW09YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlF0OnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xbTp0aGlzLnpxKGEpfSx6cTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXE6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kbzp0aGlzLk50KGEpfSxOdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT3Q6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJsOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUW18fHFjLGVkPW5ldyBxYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5QdCg0KX0pLmNhbGwoc2hvaFZvb25waXVOZWFnaSxzaG9oVm9vbnBpdU5lYWdpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.9.6 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.6.9.76.144.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sun, 29 Sep 2019 01:46:14 GMT
Server
TornadoServer/5.0
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
109
/
ssl.1.damoh.giga.de/293a82d912cf469329a1b45d87e0f3fd55d3d55b/ Frame 585E
42 B
875 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/293a82d912cf469329a1b45d87e0f3fd55d3d55b/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHNob2hWb29ucGl1TmVhZ2k9c2hvaFZvb25waXVOZWFnaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuVWV8fCh5LlVlPTApO3kuVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5abillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5jZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS51dChsKTthLnR0KG0pO2EuY3QoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGE9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5DdCh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5taC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzFdO3RoaXMucHM9dGhpcy5hWzRdO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuSHE9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy56bz1iO2IucHJvdG90eXBlPXtZbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmw6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlVvOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSHE6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy56b3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuWWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWm49ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5vZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLk5zLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5UZz17fTt0aGlzLmVmPSExfWMuWWo9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrCnRoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWWI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5UZ1thXSYmKHRoaXMuVGdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5hdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGFuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmCihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxsYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sTnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuTXMoYS5kYXRhKX0sTXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxoZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSwKcWc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMubGgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LElnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFptOmZ1bmN0aW9uKGEsCmIpe2lmKGImJiEoMD50aGlzLndhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuRXAoYSkpcmV0dXJuOyhiPXRoaXMucWcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxFcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx5ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZ2I6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfY2FjaGVfIithLGIsITApfSwkcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seWU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxIZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUWg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sCkhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixmLGQ7Zm9yKGY9NzswPD1mO2YtLSlkPWE+Pj40KmYmMTUsaCs9ZC50b1N0cmluZygxNik7CnJldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLHgsdSxyLHA7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgdD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx0LnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8CmEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IodC5wdXNoKGYpOzE0IT10Lmxlbmd0aCUxNjspdC5wdXNoKDApO3QucHVzaChuPj4+MjkpO3QucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx0Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXRbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eD1rO3U9bDtyPW07Zm9yKGY9MDsxOT49ZjtmKyspcD1kKHEsNSkrKG4meHx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9MjA7Mzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTQwOzU5Pj1mO2YrKylwPWQocSw1KSsobiZ4fG4mdXx4JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eCwKeD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NjA7Nzk+PWY7ZisrKXA9ZChxLDUpKyhuXnhedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreCY0Mjk0OTY3Mjk1O2w9bCt1JjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxoZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9CndpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbT0obHx8cSkmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9CmU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxIazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fApuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LFBuOmZ1bmN0aW9uKCl7cmV0dXJuIGEuUWkoKXx8YS5jaigpfHxhLm5xKCl8fGEubGwoKXx8YS5ybSgpfHxhLkhrKCl8fGEuUGwoKX19O3JldHVybiBudWxsIT1hLlBuKCl9LHdhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09CmFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sQ2M6ZnVuY3Rpb24oYSl7YT10aGlzLndhKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sQWE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9CiEwKTtyZXR1cm4gZH0sWHA6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy53YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEdvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LFZ0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LERnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5kaShiKSsiOiIrdGhpcy5kaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGdmOmZ1bmN0aW9uKGEpe3RoaXMuJGI9YX0sQWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy4kYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSwKQWM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLkFnKGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQWMoQil9LFBzOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD0KYS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuWHAoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxXdDpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlBzKGEpO2lmKGIpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5CZCgpO2wueWEoYSwhMCk7YT1sLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuS2EoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLk5jfHwodGhpcy5OYz17fSk7dGhpcy5OY1tmXXx8KHRoaXMuTmNbZl09MCk7dGhpcy5OY1tmXSsrOzEwPHRoaXMuTmNbZl18fChmPQpsLkJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkthKGYsZnVuY3Rpb24oZil7dmFyIGQ9ITE7Zj1mLnJlc3BvbnNlVGV4dDt0cnl7Zj1KU09OLnBhcnNlKGYpLGY9Zi5kYXRhLGZbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGQ9ITApLGZbMV0mJmZbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGQ9ITEpfWNhdGNoKGMpe31kfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZlswXT9mWzBdOiIiKSsoZlsxXT9mWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LApNZTpmdW5jdGlvbigpe2wmJmwuWT9sLmlzRW5hYmxlZCYmbC5rbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxlZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuJHEoYSl8fDA8PQphLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZGYmJndpbmRvdy5zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueWcoYSkpcmV0dXJuIHRoaXMueWcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTsKYy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkphLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlptKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIG09ZXx8bDtlPSEwO2smJihlPSExKTtpZihtJiZtLlkpaWYobS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle20ueWEoYSxlKTtlPW0ueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbS5LYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLG0sZyxrKX0uYmluZCh0aGlzKSw1MDApfSxsaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sRHI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMubGgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTGMpZm9yKHZhciBjIGluIHRoaXMuTGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5MY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sbWg6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuSmEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkRyKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkxjPWF9LFV2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxRbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFVxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLllqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlhqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuRHM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLAptZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLlRyPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJ2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IubnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlJmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5XZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi4kZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlJtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlVmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuZHY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlNyPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm9wPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Fdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIiwKbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi52bz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5jZD17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWWY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLlRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5UYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9OwpiLmNlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5TbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iua2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Wcj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnVkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5uZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuQXY9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9OwpiLiR1PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Vcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbNl07dGhpcy4kbz10aGlzLmFbOF07CnRoaXMubXA9dGhpcy5hWzFdO3RoaXMueW09dGhpcy5hWzNdO3RoaXMuaXA9dGhpcy5hWzhdO3RoaXMuR249dGhpcy5hWzEwXTt0aGlzLnRzPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMuUHI9YjtiLnByb3RvdHlwZT17bnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9yOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubXA6dGhpcy54bShhKX0seG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnltOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pcDp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR246dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5Qcnx8CmphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLm5yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuWmo9YjtiLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxTcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sbGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmxkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMubGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxqYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsKIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamEoKSsiMiJ9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5TcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlpqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkR2PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuWXI9YjtiLnByb3RvdHlwZT17Q3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkR2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuWXJ8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkN2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09CnR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5qaj1ifSkoYyk7dmFyIEw9Yy5qanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xbz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLnlvPWI7Yi5wcm90b3R5cGU9e1ZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlluOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnlvfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Wbyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLnRsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5JYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnZ0KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8odGhpcy5JYisrLHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpOjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5JYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGNmOmZ1bmN0aW9uKCl7dGhpcy5JYj0KMH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHZ0OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxRcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5paCYmTS4kdChiKX0sSHc6ZnVuY3Rpb24oKXtyZXR1cm4gZS55ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LFZxOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy50bHx8cDsoZnVuY3Rpb24oYyl7Yy52bD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPQp0aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5JYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5DYj0iIjt0aGlzLnNnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxJdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LHl0OmZ1bmN0aW9uKGIpe3RoaXMuUGU9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZX0sT2U6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD0KdGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkljKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEdnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGF4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmhxKCl8fHRoaXMuVm0oKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sVm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sCkVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxKZTpmdW5jdGlvbigpe3JldHVybiExfSxMaDpmdW5jdGlvbihiKXt0aGlzLkNiPWJ9LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2J9LApHaDpmdW5jdGlvbigpe3RoaXMuQ2I9bnVsbH0sTHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkNiJiYoYj0hMCk7cmV0dXJuIGJ9LFd3OmZ1bmN0aW9uKCl7dGhpcy5zZ3x8KHRoaXMuc2c9ITApfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxDdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy52bHx8dDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLk5mPSIxIjt0aGlzLk9mPSIyIjt0aGlzLkttPSIzIjt0aGlzLlBjPTA7dGhpcy5waD0zMDt0aGlzLlJiPVtdO3RoaXMuaGI9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5hZz10aGlzLmdpPQohMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5oZihiKTt0aGlzLnd0KGEpfSxmOmZ1bmN0aW9uKCl7fSxwYTpmdW5jdGlvbigpe3RoaXMuZ2l8fCh0aGlzLmdpPSEwLGUuTWUoKSl9LFRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sTXE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmphKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldJiZ3aW5kb3dbaC5qYSgpXVtiLmthKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5qZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuTXEoKTtpZighdGhpcy5TcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5qZigpO3JldHVybn10aGlzLmpmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy4kaCgpO3RoaXMuYWc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMudmEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmhiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSwkaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJgoodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmhiKXtmb3IodmFyIGg9MDtoPHRoaXMuaGIubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuaGJbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLGI9dGhpcy5oYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0samY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9mfSxEdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLkttfSxuYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LFRmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSxzdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5PZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUGN9LGhmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnVpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllvPXRoaXMuYVsxXTt0aGlzLkxsPXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLlhsPXRoaXMuYVs2XTt0aGlzLlJ2PXRoaXMuYVs1XTsKdGhpcy5Bbj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLnpqPWI7Yi5wcm90b3R5cGU9e1hvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Zbzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVHY6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5YbDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnY6dGhpcy56bihhKX0sem46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy56anx8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuWG8oNCk7CihmdW5jdGlvbihjKXtjLkRqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuRGp8fG9hOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLAphPWIudHc7YT9hLm9hP2Eub2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5Fanx8cGE7KGZ1bmN0aW9uKGMpe2MuRmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuRmp8fHFhOyhuZXcgcWEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Mbz10aGlzLmFbNl07CnRoaXMueW49dGhpcy5hWzldO3RoaXMuY3M9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zcD1iO2IucHJvdG90eXBlPXtLbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTG86dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLnNwfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5Lbyg0KTsoZnVuY3Rpb24oYyl7Yy5zaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMueGcoKTt0aGlzLnpnKCk7dGhpcy51bz0hMX0seGc6ZnVuY3Rpb24oKXt0aGlzLmJjPQohMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0semc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpOwphLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5za3x8c2E7KGZ1bmN0aW9uKGMpe2Mucms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUmM9ITE7dGhpcy5iZT0xO3RoaXMuU2M9W107dGhpcy53Yj0hMTt0aGlzLmdldFBsYXllcigpOwp2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLndiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy53Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy53Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMud2I9ITApKTp0aGlzLnYoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMucGgmJgohdGhpcy52YSgpJiYodGhpcy53Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudmEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnVvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiYoYS54ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudigib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5waCYmIXRoaXMudmEoKSYmKHRoaXMud2I/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlNjLmluZGV4T2YoYSkmJgp0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5TYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sR3I6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUWgoYS52aWRlb1RhZyk/YS5iYz90aGlzLnYoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlJjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnhnKCksYS56ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5ya3x8dGE7KGZ1bmN0aW9uKGMpe2MudGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5OcCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLlZxKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmYoKSl9fXRoaXMuVCgpfX0sRXc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCk5wOmZ1bmN0aW9uKCl7dmFyIGI9ZS53YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS55YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy50a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzVdfWMudW09YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ObTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudW18fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLk1tKDQpOyhmdW5jdGlvbihjKXtjLmltPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5WKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuaW18fHhhOyhmdW5jdGlvbihjKXtjLmhtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPXRoaXMuV2M9ITE7dGhpcy5DaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudGM9dGhpcy5YZz0hMTt0aGlzLlJyKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5zaCgpLHRoaXMuZm8oKSx0aGlzLnJiKCkpfSxScjpmdW5jdGlvbihiKXtyZXR1cm4gZS5BYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxYdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwKIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlgsIjsiLHR5cGVvZiBiLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWD9iLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlg/dHlwZW9mIGIuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6CiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KPwp0eXBlb2YgYi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5pZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNoKX0semI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJgoodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYj10aGlzLnpiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sS2c6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy56YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSxUcTpmdW5jdGlvbigpe2lmKCF0aGlzLldnKXt2YXIgYj0KdGhpcy56YigpLGE9dGhpcy5ScSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuV2c9ITApfXJldHVybiB0aGlzLldnfSxScTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuV2MmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLldjPSEwKTtyZXR1cm4gdGhpcy5XY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuJHMoKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sJHM6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuS2coKTtpZihifHx0aGlzLnZhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0KITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5BYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZmEoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxEdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGcmJmIuYWRzJiYodGhpcy5wZz1iLmFkcyk7cmV0dXJuIHRoaXMucGd9LGZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApOwp0aGlzLnMoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLktnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuVHEoKSl7dmFyIGE9dGhpcy56YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnpiKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuemIoKX1lbHNlIHRoaXMuWGc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy56YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6KHRoaXMuZmEoITApLHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSw1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGhvOmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMueWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnljIT1iLmFkcy5zdGF0ZSYmKHRoaXMueWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLnljKXt0aGlzLnYoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMueWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhvKCl9LmJpbmQodGhpcyksMTApfSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxDYTpmdW5jdGlvbigpezA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnZhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sCm9vOmZ1bmN0aW9uKCl7dGhpcy5Nd3x8KDEwPHRoaXMubXY/KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5tdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmd0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9vKCl9LmJpbmQodGhpcyksNTApKSl9LGd0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLm52KXt0aGlzLm52PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuaG18fHlhOyhmdW5jdGlvbihjKXtjLmptPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5SaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUmgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUmg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLkljKX19KX0pKGMpO3ZhciB6YT1jLmptfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzVdO3RoaXMucHE9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuRnA9YjtiLnByb3RvdHlwZT17QWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJqOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FaTp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkZwfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuQWooNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxKczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkNiLGg9dGhpcy5rYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7dmFyIENhPWMucWx8fENhOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZWF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIucygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnphKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy50cD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnRwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuSnMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMucGx8fERhOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5tYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLnJsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud249dGhpcy5hWzJdO3RoaXMuZGw9dGhpcy5hWzZdO3RoaXMuZG09dGhpcy5hWzddO3RoaXMuQms9dGhpcy5hWzEwXTt0aGlzLmtuPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMubnQ9YjtiLnByb3RvdHlwZT17dm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnduOnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZG06dGhpcy5BayhhKX0sQWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJrOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT0KYy5udHx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2Mudm4oNCk7KGZ1bmN0aW9uKGMpe2Muams9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuSGcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5Mcz1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0OwpoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkxzKXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuamQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmpkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5qZCl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG5vOmZ1bmN0aW9uKCl7ZS5kaCh0aGlzLmpkKTtlLkZlKHRoaXMuamQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSwKSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmprfHxIYTsoZnVuY3Rpb24oYyl7Yy5paz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zKCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5pa3x8SWE7KGZ1bmN0aW9uKGMpe2Mua2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuSGcoYiwiZWxlbWVudElEIik7aWYoZS5kaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIEphPWMua2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ebz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLm9sPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMub2x8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkNvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy4kaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT0KYX0seHQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLiRqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZmI9YTt0aGlzLkNnPXRoaXMub2k9ITE7dGhpcy50aD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZmI9bmV3IHooYSkpO3ZhciBjPXRoaXMudGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuZmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UueHQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmFrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkNnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdHJ5e3RoaXMuU2g/dGhpcy50Yi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMub2l8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy50Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuSWUodGhpcy5mYi51cmwpP2wuTmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5JZSh0aGlzLmZiLnVybCksdGhpcy50aCYmdGhpcy50aCgpfXJldHVybiB0aGlzLnRifX19KShjKTt2YXIgTWE9Yy5ha3x8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPQp0aGlzLldkPSExfWMua2o9YjtiLnByb3RvdHlwZT17QnQ6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxBdDpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGV0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17YXc6IkFkQ2xpY2tUaHJ1IixjdzoiQWRFcnJvciIsZHc6IkFkU3RvcHBlZCIsZ3c6IkFkTGluZWFyQ2hhbmdlIixodzoiQWRUYWdQYXJzZWQiLGx3OiJBZFZpZGVvQ29tcGxldGUiLHB3OiJBZExvYWRlZCIscXc6IkFkU2tpcHBlZCIscnc6IkFkU3RhcnRlZCIsZXc6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdzoiQWRJbXByZXNzaW9uIixidzoiQWRDcmVhdGl2ZVZpZXciLGl3OiJBZFZpZGVvTWlkcG9pbnQiLGt3OiJBZFBhdXNlZCIsCm53OiJBZFZpZGVvU3RhcnQiLG93OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGR0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5WZClmb3IodmFyIGIgaW4gdGhpcy5GYS5WZCl0aGlzLkZhLlZkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5WZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYS5nZXRFcnJvcigpOwphJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuZXQoKTt0aGlzLkZhJiZ0aGlzLmR0KCl9fX0pKGMpO3ZhciBOYT1jLmtqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmplPXRoaXMudmM9dGhpcy54Yj1udWxsO3RoaXMuSG89dGhpcy5KYj10aGlzLmtoPSExO3RoaXMuSmE9IiI7dGhpcy5maD0hMTt0aGlzLnVhPXRoaXMub2Q9IiI7dGhpcy5haD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLkJhPVtdO3RoaXMuUWc9dGhpcy5mYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLklmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuS2Q9W107dGhpcy5nYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRGM9ITE7dGhpcy5wbz10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLmxjPXRoaXMudWc9dGhpcy53Zj10aGlzLk5kPXRoaXMubGU9dGhpcy5RYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnBkPTA7dGhpcy5TZz0hMTt0aGlzLlJnPTFFMzt0aGlzLlljPSExO3RoaXMuUWE9MUUzO3RoaXMuUWY9IiJ9Yy5iaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLndjLGFkdGFnbW9kaWZpZXI6dGhpcy54YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMudmMsCmFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5raCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5Ibyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLmZoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLnVhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5haCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5mYyxob21hZEFkcGF0aDp0aGlzLlFnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5JZixIT01BRF9CTE9DS0VEOnRoaXMuR2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMubmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLkhmLHRlc3RIaWRlOnRoaXMuaGMsdGVzdFRhZ3M6dGhpcy5pYyx0ZXN0VGFnc0pTOnRoaXMuamMsCnRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLnBvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubGMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5ZYyxhZEZhbGxiYWNrVVJMOnRoaXMuUWZ9fSxmcTpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYKMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxPcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLlFuKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLndhKGEpO2Y/KHRoaXMucmQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuQmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy53Y3x8dGhpcy54Ynx8dGhpcy52Y3x8dGhpcy5qZSkmJihnPXRoaXMuTXIoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5QcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHJkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxJZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sUHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIueXc7cmV0dXJuIm5vbmUifSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuS2hdfSxCZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMucWQoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0scWg6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS53YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucWgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLnFoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LE1yOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLnhiKWZvcih2YXIgYiBpbiB0aGlzLnhiKXRoaXMueGIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueGJbYl0pKTt0aGlzLnZjJiYoYT10aGlzLkxyKGEsdGhpcy52YykpO3JldHVybiBhfSxtbzpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5pbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxpbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuQnQoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkF0KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLmZoPSEwO3RoaXMub2Q9YTt0aGlzLnVhPWI7dGhpcy5hZj0KZDt0aGlzLlBkPWY7dGhpcy56Yz1jO3RoaXMuRGE9ZXx8e307dGhpcy5tbygpO3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy5BcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9Yix0aGlzLnhjKCl9Y2F0Y2goayl7dGhpcy5oYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy5vZCt0aGlzLmdlKCJnbG9iYWwiKSksdGhpcy5jcS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiZ2xvYmFsIik7CiJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sQXI6ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyB6KHRoaXMudWErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5EYSYmdGhpcy5EYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRGEmJnRoaXMuRGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSwKYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9CndpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5DYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuemM9ITEpO3RoaXMuemMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy56Yz90aGlzLnpjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlk9dGhpcy5haD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5HZikpO3RoaXMuTmIoKTtlLkFjKGsuRHMpOyhiPWUuQ2ModGhpcy5xZCgpKSl8fChiPWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGNxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPQp0aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZmN8fHRoaXMuSmF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy51YX1lbHNlIGE9dGhpcy51YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7CnRoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLlFnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQmEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5mYyYmdGhpcy5KYSYmdGhpcy5CYS5sZW5ndGg/dGhpcy5GYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX0sRmM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5CZCgpKSxkPXRoaXMud2EodGhpcy5mYyk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5mYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkthKGIsdGhpcy5jdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuT2w/dGhpcy5oYSgibm9TVk1Db25maWciKToodGhpcy5PbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuRmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGN1OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuRGM9ITA7dGhpcy5GYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuTWIoYi5zdHJpY3QpO3RoaXMud2Y9dGhpcy5NYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy51Zz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5oYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmpjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLndjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMueGI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMudmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmplPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmtoPWIuanNwb3B1cHN8fCExO3RoaXMuSmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMubGM9Yi52cGFpZHx8ITE7dGhpcy5EYS52cGFpZD10aGlzLmxjO3RoaXMuTmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5aYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMubGk9Yi52bWFwc3x8IiI7dGhpcy5ZYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUWE9CmIuYml0cmF0ZXx8MUUzO3RoaXMuUWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuZ2M9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5XcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmdjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5EYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuRGM9ITAsdGhpcy5GYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5KdSgpJiYodGhpcy5oY3x8dGhpcy5qY3x8dGhpcy5pY3x8dGhpcy5nY3x8dGhpcy5LZCk/dGhpcy5hZj8odGhpcy5VYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLm5lKCksdGhpcy5OYigpKTp0aGlzLm11KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubnUoKSl9fSwKbXU6ZnVuY3Rpb24oKXt0aGlzLmx1KCk7dGhpcy5vdSgpfSxvdTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmFhKDEwKSxnPWUuYWEoMTApLEg9ZS5hYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS55YihhKGMpKSsKYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5oZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5EYSYmdGhpcy5EYS5wbGF5ZXImJnRoaXMuRGEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7cmV0dXJufXRoaXMuaGEoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG51OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpfSxNYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLlVhPSEwLApkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxsdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmpoKCkpdGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpOwphPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5pYz10aGlzLktkKSYmdGhpcy5pYy5sZW5ndGgpe3ZhciBkPXRoaXMuaWMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5wZigpfSxydTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuS2EobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuc3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmpjJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlZoKCl9LHN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwKITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0scGY6ZnVuY3Rpb24oKXt0aGlzLmdjPyh0aGlzLnNmKyssdGhpcy5LYShuZXcgeih0aGlzLmdjKSx0aGlzLmt1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuVGgoKX0scWY6ZnVuY3Rpb24oYSl7dGhpcy5NYyh0aGlzLkhmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIisKYSl9LGt1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKTt0aGlzLm5lKCl9LGpoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sTmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVmEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLAphKyIiK2IsITApOyIxIj09PWImJihlLkFhKCJ0LW9ubGluZS5kZSIpfHxlLkFhKCJnaWdhLmRlIil8fGUuQWEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuamgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSWYpKTt0aGlzLlBkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUGQmJnRoaXMuUGQoKX0sbG86ZnVuY3Rpb24oKXtpZih0aGlzLndmJiZ0aGlzLmZxKCkpe3ZhciBhPXRoaXMuT3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LCRoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMucGR8fAoodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlJnJiYhdGhpcy5TZyYmKHRoaXMuU2c9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlJnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLm9pPSEwKTtjJiZlLldxKCkmJihhLkNnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxqbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMucmQoKXx8KGE9dGhpcy53YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxqdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0sa286ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdi5iaW5kKHRoaXMpLHRoaXMuYnYuYmluZCh0aGlzKSl9LGN2OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMucHAoKX0sYnY6ZnVuY3Rpb24oKXt9LHBwOmZ1bmN0aW9uKCl7ZS5BYyhrLm9wKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5KYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSxKdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHliOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx3YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmJrfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaT10aGlzLmFbNV07dGhpcy5rcT10aGlzLmFbM107dGhpcy5DaT10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbOV07dGhpcy53cT10aGlzLmFbMV07dGhpcy56az10aGlzLmFbM107dGhpcy5BbT10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNl07dGhpcy5Jdj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5ycj1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTGk6dGhpcy5qcShhKX0sCmpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ2k6dGhpcy5MbihhKX0sTG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk1uOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3E6dGhpcy55ayhhKX0seWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnprOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BbTp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudWo6dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMucnJ8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmcuUD90aGlzLmJiPWEuZy5QKCk6dGhpcy5iYj0iIjthLmcuWmcmJmEuZy5aZyh7cGF1c2U6dGhpcy54ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuWHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZzt0aGlzLlZiPXRoaXMuWGM9ITE7dGhpcy5Obj0xRTM7dGhpcy5yYT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlduPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlZjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmCih0aGlzLlZjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5nKSYmdGhpcy5iLmcudSYmKGE9dGhpcy5iLmcudSgpKSx0aGlzLlZjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudWg9dGhpcy5HZD0hMTt0aGlzLm5oPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy53bz1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5lZD10aGlzLm9mPXRoaXMuc2I9dGhpcy5tYz0KdGhpcy53aD10aGlzLmtkPXRoaXMuTXU9dGhpcy52Yj10aGlzLkZiPSExO3RoaXMucmM9W107dGhpcy5jYz17fTt0aGlzLnlzPTIwMDt0aGlzLkRmPXRoaXMuRWY9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy53ZD17fX1jLldqPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLiRiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5JZCgiY2FsbCIsdGhpcy5aYSgpKTtlLncoay5UbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxMZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnZiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihnPSEwKTtpZih0aGlzLkwuWSl0aGlzLm1mKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5MLmxvKCksYz1sLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm5oLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5sYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmcuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZy5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwubGMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5MZShhLGIsZCl9LDUwKX19LFdlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5RZD10aGlzLk9iPXRoaXMua2Q9ITE7dGhpcy5jPWE7dGhpcy5HdCh0aGlzLmMpO3RoaXMud2Q9bmV3IFFhKHRoaXMuYy5ndix0aGlzLnZpZGVvLHt9KTt0aGlzLk5nKGEpO3RoaXMucmM9dGhpcy5FZyhhKTt0aGlzLnFvKCl9LE5nOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLkhkPXRoaXMuWnAoYSkpLHRoaXMuTmcoYS5wYXJlbnQpKX0sRWc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZgpifHwoYz10aGlzLkVnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuSnAoYSkpKTtyZXR1cm4gY30sSnA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuWGQuY29kZT9lLncoay5Cdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLk1lKCksYj09Ri5MZi5jb2RlJiZlLncoay5Tcix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5ucCx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuSWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkpmLmNvZGU6ZS53KGsuZHYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5NZi5jb2RlOmUudyhrLkV2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LllkLmNvZGU6ZS53KGsuSnYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpOwpicmVhaztjYXNlIHcuVWQuY29kZTplLncoay5Ucix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLncoay4kdSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRmYuY29kZTplLncoay5hdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuS2UoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LApHdDpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuWXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5ibiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5YbShiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuSWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuJG0oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuc28oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkV0KCkpOnRoaXMuYy5vcmlnaW4udmcody5VZCl9LEV0OmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnNiPXRoaXMubWM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5uZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMuc2I9ITApO2Uub2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnRhJiZlLmFuKHRoaXMuYy5vcmlnaW4udGEpO2UuZ2IoInNldFVwVnBhaWQiKTt0aGlzLklkKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnhoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuYnEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZWcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnJjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMucHYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5xdigpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9CiEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy51digpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMueXYoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMud3YoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMueHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy56digpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy52digpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5taSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsubWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLlljJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnR2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5jZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5FZiYmCih0aGlzLkRmPSExLHRoaXMuZWMoKSksdGhpcy5zdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMuc2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLnZmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5iZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sc3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubWM9ITF9LHV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHF2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZ2IoImltcHJlc3Npb24iKTt0aGlzLlBoKCk7ZS53KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZ2IoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx3djpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO2UuZ2IoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LHh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmdiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5nYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSx2djpmdW5jdGlvbigpe3RoaXMueWYoKTtlLmdiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LG1pOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZ2IoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxwdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmdiKCJlcnIiLGIpO2UudyhrLkF2LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5taSghMCl9LFhtOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5yZCgpKXt2YXIgZD1iLndhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubHYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5ObikpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5YYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlhjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC51Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuaHYoKTt0aGlzLmhpKCk7dGhpcy5mZygpO3RoaXMuYi54aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlNmKCl9LFNmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5TZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLlJtLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSxVbTpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjwKYS5sZW5ndGg7ZisrKWM9ZS5JZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLld0KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5SZCYmdGhpcy5VbSh0aGlzLmMuUmQpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5RZHx8KGUudyhrLlZyLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnVifHx0aGlzLmMucGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLlZiPXRoaXMuWGM9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5vZj0KITA7dGhpcy5iLkJlKCk7dGhpcy5hYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudWImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucGMmJihhP3RoaXMuYy5vcmlnaW4ucmgoKTp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxsdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5qbygpO3RoaXMuYy5vcmlnaW4udmcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5NdSl0aGlzLlJhKCk7CmVsc2V7dGhpcy5hYz0hMDt0aGlzLmIuZy5MYSYmIXRoaXMub2YmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmNkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlJ1KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudyhrLmtpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YiwKcGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLllmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnViPyh0aGlzLlZiPXRoaXMuWGM9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6CnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy53aHx8KHRoaXMud2g9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFJ1OmZ1bmN0aW9uKGEpe2UudyhrLmNlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZiKSx0aGlzLnZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5QaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlVmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLlJmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYKKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay4kZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmNpPWEpfSxJZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sUGg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHwKdGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMud2QmJnRoaXMud2QudHJhY2smJnRoaXMud2QudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuJHAodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkhkLmltcHJlc3Npb25zJiZlLlVxKGcudXJsLHRoaXMuSGQuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsCmcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5TbSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLkZvKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuRWYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5XbShjKSxmfHwoZj10aGlzLnRnKSxlfHwoZT10aGlzLnRnKSx0aGlzLlltKGEpLHRoaXMuTC5LYShiLApmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LHFvOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sWnQ6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sJHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxGbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuanYuYmluZCh0aGlzKSl9LApqdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLncoay5tZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWWMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOgooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLkRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuWmMmJihiPXRoaXMuTC5aYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5BYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LApBYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLlpjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLndvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0KIkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQmIoKTt0aGlzLkFiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksCmcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk91LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTnUuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkJiKCk7dGhpcy5BYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksCmwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSksCnRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5CYigpO3RoaXMuQWIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy54YSYmKHRoaXMueGEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmJnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsubmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlFlKCkpO3RoaXMuQmIoKX19LEJiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5UYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkJiKCksdGhpcy5BYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx4ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5hZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLlRjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LE91OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsudWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFh1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay52Zix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUud2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5RYyl8fHRoaXMudWg/KHRoaXMuZWQ9ITAsdGhpcy52YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52YiksdGhpcy52Yj0hMSksdGhpcy5vZygpKToodGhpcy51aD10aGlzLkVmPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZWcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuWnQoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnlzKToodGhpcy5vZj0hMCx0aGlzLmIuQmUoKSx0aGlzLmIuaXQoKSx0aGlzLmFjPSExLGUudyhrLnZvLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy54ZSgpLkdoKCkpfSwKeGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sZmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnhkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuV24rIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSmcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkpnKCkpO3JldHVybiBhfSx0ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuV2p8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVxPXRoaXMuYVs1XTt0aGlzLnl1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMubG49YjtiLnByb3RvdHlwZT17RHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkVxOnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55dTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMubG58fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsCm5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5EcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkVhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMucWM9dGhpcy5zYz0hMTt0aGlzLnRhPSIiO3RoaXMuQmY9ITE7dGhpcy5VZz0iIjtkJiZkLmVtcHR5P3RoaXMuRnIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5lbT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5oZCgpLGI7Yj1lLndhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTsKYj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC55YShsLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucWcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuSmQoYSkpKyImdHlwZT1qcyIsYj1sLnlhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwueWEobC5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS4kYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuJGJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLiRifHx0aGlzLlpxKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLmp1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LFpxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sRXI6ZnVuY3Rpb24oYSl7dGhpcy5TcyhhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5VZz1hLnJlc3BvbnNlVVJMO3RoaXMuWC5sZW5ndGg/dGhpcy5IYygpOnRoaXMucWEodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLkJmP0YuWGQ6CkYuS2Z9KSl9LEZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWD10aGlzLkZnKCk7dGhpcy5zYz10aGlzLnJmKCk7dGhpcy5xYz10aGlzLlVoKCk7dGhpcy5YLmxlbmd0aD90aGlzLkhjKCk6dGhpcy5xYSh0aGlzLlNhKHcuT2Mse2Vycm9yOnRoaXMuQmY/Ri5YZDpGLktmfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5TYSh3LkpmLHtkZXB0aDphfSkpfSxIYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLmFyKCk/dGhpcy50dSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLk9nKCksaCx7QWRTeXN0ZW06dGhpcy5JcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnFhKHRoaXMuU2Eody5NZikpOihhPTAsdGhpcy5ZdSgpJiZ0aGlzLldlKHRoaXMueG8oKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMuc2M/Cih0aGlzLnNjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkhjKCkpOnRoaXMucGFyZW50LlJlKCl9LHJoOmZ1bmN0aW9uKCl7dGhpcy5xYz8odGhpcy5xYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5IYygpKTp0aGlzLnBhcmVudC5yaCgpfSxZdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1KCk/dGhpcy5wdSgpPyEwOigtMSE9dGhpcy5CYygpP3RoaXMucWEodGhpcy5TYSh3LlRkKSk6dGhpcy5xYSh0aGlzLlNhKHcuRmYpKSwhMSk6KHRoaXMucWEodGhpcy5TYSh3Lk9jLEYuTGYpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVWcpO2EuUGE9YS5QYS5jb25jYXQodGhpcy5OZSgpKTthLnViPWEudWI/YS51Yjp0aGlzLnNjO2EucGM9YS5wYz9hLnBjOnRoaXMucWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYKIXRoaXMub3B0aW9ucy5CZzt0aGlzLnBhcmVudC5XZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5CYygpO2EuTz10aGlzLkxnKCk7YS5VYj10aGlzLktwKCk7YS5ndj1bXTthLm9yaWdpbj10aGlzO2EuQT10aGlzLkhwKCk7YS5sZj10aGlzLllwKGEuZHVyYXRpb24pO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYil7dGhpcy50YXx8KHRoaXMudGE9IiIpO2IuJGE9Yi4kYT9iLiRhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5CZzt0aGlzLlUmJihiLlBhPWIuZXJyb3IuY29kZSE9dy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMuTHAoKSk6Yi5QYS5jb25jYXQodGhpcy5UcCgpKSk7dGhpcy5YLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LldiJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LldiJiZ0aGlzLnBhcmVudC5XYihiKSxhPTAsdGhpcy5IYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnFhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucWEmJnRoaXMucGFyZW50LnFhKGIpLGE9MCl9LFdiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LldiKGEpfSx2ZzpmdW5jdGlvbihhLGIpe3RoaXMucWEodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSx0dTpmdW5jdGlvbigpe3JldHVybiBhPGh9LHF1OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5MZygpLmxlbmd0aH0scHU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkJjKCl9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5YLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LFNzOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxhcjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2coKS5sZW5ndGh9LE9nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJWQVNUQWRUYWdVUkkiKX0sSXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmJoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5iaChhLnBhcmVudE5vZGUpOiExfSxUcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxMcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sS3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCkxnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHp3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLlFhfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxIcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLm5kKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxCYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFlwOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVnQoZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLm5kKGEpOiIifSxuZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuZW18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR209dGhpcy5hWzFdO3RoaXMuVnU9dGhpcy5hWzddO3RoaXMubXQ9dGhpcy5hWzhdO3RoaXMuUHE9dGhpcy5hWzZdO3RoaXMuQ249dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMV19Yy5Sbj1iO2IucHJvdG90eXBlPXtGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMubHQoYSl9LGx0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUHE6CnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dbjp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlJufHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5GbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQT10aGlzLnBjPXRoaXMudWI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5zbD1iO2IucHJvdG90eXBlPXtzbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxScDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRWEpe3ZhciBhPXRoaXMub3JpZ2luLkVhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxKZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5ScCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sYnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLnNsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbNl07dGhpcy55aT10aGlzLmFbOF07dGhpcy5jcj0KdGhpcy5hWzRdO3RoaXMub209dGhpcy5hWzddO3RoaXMubWo9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNV19Yy5Fbz1iO2IucHJvdG90eXBlPXtIbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW06dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Fb3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuSG0oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsCmNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE9hOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LE1mOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSwKSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxadjp7dHlwZToiZXJyb3IiLApjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtLZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxMZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSwkdjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbN107dGhpcy5icD10aGlzLmFbMl07dGhpcy5ucz10aGlzLmFbN107dGhpcy5Taj10aGlzLmFbNF07dGhpcy5BaT10aGlzLmFbNl07dGhpcy55cT10aGlzLmFbMl07dGhpcy5LdD10aGlzLmFbMV07dGhpcy5pcj10aGlzLmFbNV07dGhpcy5JdD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLkVtPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52czp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYnA6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tajp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWk6dGhpcy54cShhKX0seHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlxOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLkt0OnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pcjp0aGlzLkh0KGEpfSxIdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkVtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy51cyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuQ2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DcT10aGlzLmFbNF07CnRoaXMudXE9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzNdfWMuSXM9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNxOnRoaXMudHEoYSl9LHRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51cTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFlhPWMuSXN8fFlhLEpjPW5ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUpjLkJxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5IaD1hO3RoaXMudmlkZW89Yjt0aGlzLk9kPVtdO3RoaXMuRWg9W107dGhpcy5TZT1bXTt0aGlzLmt2PSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7CnRoaXMuTSgpfWMuTWs9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5IaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkhoW2FdLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtlLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGc9ZS5jb250ZW50V2luZG93O2cuVXc9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuZnQuYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuWHMuYmluZCh0aGlzKX07dmFyIGs9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7Cmsub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9Zy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtnLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7dGhpcy5PZC5wdXNoKHtzcmM6YyxmcmFtZTplLENzOmYsdmVuZG9yOmIuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLlNlLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuU2VbYl07Yy50eXBlPT09YSYmYy4kbih0aGlzLk1wKGEpKX19LE1wOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e2N4OiEwLGJ4OjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e1F3OiJ2aWRlbyIsZXg6ImpzQ3VzdG9tIixmeDoiMS4wLjAtZGV2In19OwpjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxneDoxLEF3OjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sYXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLk9kLmxlbmd0aDtiKyspaWYodGhpcy5PZFtiXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLk9kW2JdLkNzO3JldHVybiIifSxmdDpmdW5jdGlvbihhLGIpe3RoaXMuRWgucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMuYXEoYiksdmVuZG9yOmJ9KTsKdGhpcy5YdCgpfSxYczpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMua3YubWFwKGZ1bmN0aW9uKGEpe3RoaXMuY2coYSxiKX0uYmluZCh0aGlzKSk6dGhpcy5jZyhhLGIpfSxjZzpmdW5jdGlvbihhLGIpe3RoaXMuU2UucHVzaCh7dHlwZTphLCRuOmIsJHc6ITF9KX0sWHQ6ZnVuY3Rpb24oKXt0aGlzLkVoLm1hcChmdW5jdGlvbihhKXthLlhxfHwoYS5Udyh7YWRTZXNzaW9uSWQ6ZS5hYSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuZHgsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLlhxPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO3ZhciBRYT1jLk1rfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kaz10aGlzLmFbMTBdO3RoaXMuTmw9dGhpcy5hWzNdO3RoaXMuTHY9CnRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLnBqPXRoaXMuYVs5XTt0aGlzLmtyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzddfWMuRmk9YjtiLnByb3RvdHlwZT17Wms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRrOnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ObDp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTHY6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhrOnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLkZpfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuWmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5nPWE7dGhpcy5qYj1hLkdnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuZGc9ITE7dGhpcy5UYj1bXX1jLm5qPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYsCnk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5pcShhKSxnPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtnPXt4OmIseTpjfTtmJiYoZy5wb3NpdGlvbj1mKTtyZXR1cm4gZ30sYnU6ZnVuY3Rpb24oKXt0aGlzLmRnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0seGg6ZnVuY3Rpb24oKXt0aGlzLmcucGF1c2UoKTtlLncoay5jZCx0aGlzLmcudSgpKX0saXQ6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5nLnBsYXkoKSxlLncoay5kZCx0aGlzLmcudSgpKSl9LGtmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuamIpO3RoaXMuZy5KYyYmdGhpcy5nLkpjKCk/dGhpcy5nLkdnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sCmlxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx4cDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueHAodGhpcy5qYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5nLkpjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5RaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxiZzpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMubmp8fCRhLEM9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLll2PXRoaXMuYVs2XTt0aGlzLmdwPXRoaXMuYVs2XTt0aGlzLk10PXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLndqPXRoaXMuYVs5XTt0aGlzLndpPXRoaXMuYVs5XTt0aGlzLlNpPXRoaXMuYVs3XTt0aGlzLnpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLkJzPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnY6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLll2OnRoaXMuZnAoYSl9LGZwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncDp0aGlzLkx0KGEpfSxMdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXQ6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJzOgp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud2o6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLndpOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Cc3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuTXYoNCk7KGZ1bmN0aW9uKGMpe2Muamw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwKKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5EZChiKTt0aGlzLnJnKCl9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxyZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiYKYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5qbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuaWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlZmPXRoaXMuWGY9CnRoaXMuWWc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMudXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWWcmJnRoaXMubGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5DYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYWQoKTt0aGlzLllnPSEwO3RoaXMubGcoKX0uYmluZCh0aGlzKSk7CnRoaXMuaGcoKX0sbGc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5hZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5hZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVmYmJiF0aGlzLlhmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0sYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1nKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LE1nOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGhnOmZ1bmN0aW9uKCl7aWYodGhpcy5hZCgpKXt2YXIgYj0KdGhpcy5NZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlhmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVmY9Yi54d310aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLk93KCk6ITF9LEJjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5CYygpOi0xfSxVcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx1cDpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMucygiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCl9LmJpbmQodGhpcyksMTAwKX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlVwKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuaWx8fGRiOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWXE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ud2wuTG0uSm0/d2luZG93Lk9PLndsLkxtLkptLnZ3KGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZcSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMua2x8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jcj10aGlzLmFbNV07dGhpcy5xaz10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbMl07dGhpcy5qPQp0aGlzLmFbOF19Yy5Jaz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSXI6dGhpcy5wayhhKX0scGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFrOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuSWt8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkhyKDQpOyhmdW5jdGlvbihjKXtjLmFqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5QZygpfSxQZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7CmJ8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlYoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LApOYTpmdW5jdGlvbigpe3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlcmJigwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLmFqfHxoYjsoZnVuY3Rpb24oYyl7Yy4kaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxpZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnYoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnBhKCk6dGhpcy5tKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5pZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmlnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLiRpfHxpYjsoZnVuY3Rpb24oYyl7Yy5iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LERoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwKKGIuRGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudnB8fCh0aGlzLnZwPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5EaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuRGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmJqfHxqYixUPW5ldyBqYihyKTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRW49dGhpcy5hWzVdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuR2s9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsyXTt0aGlzLm1rPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLnlsPXRoaXMuYVs0XTt0aGlzLmV1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuT289YjtiLnByb3RvdHlwZT17RG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVuOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kajp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkxqOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWHI6dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlsOnRoaXMuZHUoYSl9LApkdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmV1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Pb3x8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuRG4oNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSmM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLlVsfHxVOyhmdW5jdGlvbihjKXtjLlRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuVWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnYuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTsKeS5VYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmFzKGEpfS5iaW5kKHRoaXMpKTt5LlVjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuVWMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LmVxKCl9LGFzOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudigpO3RoaXMucGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwKMTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLnYoKTt0aGlzLnBhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5UbHx8VjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy52ZCYmKGI9ZS5HbyhiLHRoaXMudmQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7CnZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmYoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy52ZHx8KHRoaXMudmQ9W10pLHRoaXMudmQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFVjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LHV1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuR2N8fAoodGhpcy5HYz1bXSksdGhpcy5HYy5wdXNoKGIpLHRoaXMuaHQoKSYmKHRoaXMuY2YoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sZXE6ZnVuY3Rpb24oKXtpZih0aGlzLkdjKWZvcih2YXIgYj0wO2I8dGhpcy5HYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkdjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPQpiLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkudXUoYil9fSl9KShjKTt2YXIgbGI9Yy5WbHx8bGIseT1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbMl07dGhpcy5rdD10aGlzLmFbNF07dGhpcy5tcj10aGlzLmFbNl07dGhpcy52az10aGlzLmFbMV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5JdT10aGlzLmFbOF07dGhpcy5DdT10aGlzLmFbOF07dGhpcy5Waz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkZxPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ncjp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1yOnRoaXMudWsoYSl9LAp1azpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudms6dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkF1OnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5JdTp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3U6dGhpcy5VayhhKX0sVWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5GcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLlhpfHxuYjsoZnVuY3Rpb24oYyl7Yy5ZaT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnYoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpOwphLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuWWl8fG9iOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZT1uZXcgbmIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgb2IoZSx0aGlzLkkpKS5mKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9CmIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuWml8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5oaj10aGlzLmFbOF07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Uaz10aGlzLmFbNl07dGhpcy5Bcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs0XX1jLnVyPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ubjp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGo6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vazoKdGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5pOnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Uazp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLnVyfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5tbig0KTsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuV3ModGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sV3M6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5wYXVzZSYmdGhpcy5pYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiZ0aGlzLmlhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWmc6ZnVuY3Rpb24oYil7dGhpcy5pYT1ifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgc2I9Yy5Ya3x8c2I7KGZ1bmN0aW9uKGMpe2MuV2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLm5pPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm5hKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLldrfHx0YjsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHNiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IHRiKGMsdGhpcy5JKSkuZigpKX19ZWxzZSB0aGlzLlQoKX19KX0pKGMpO3ZhciB1Yj1jLllrfHx1YixXPW5ldyB1YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucnA9dGhpcy5hWzRdO3RoaXMua3A9dGhpcy5hWzNdO3RoaXMuRHA9dGhpcy5hWzddO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzZdfWMuaWo9YjtiLnByb3RvdHlwZT17cXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuaWp8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnFwKDQpOyhmdW5jdGlvbihjKXtjLmxtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLmxtfHx3YjsoZnVuY3Rpb24oYyl7Yy5rbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sVXM6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE/dGhpcy5Vcyh0aGlzLnphKToodGhpcy56YT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuemEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmCnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5lYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5lYlthXSYmMzAzIT10aGlzLmViW2FdJiY0MDMhPXRoaXMuZWJbYV0mJihiPSExKTtpZihiKXRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLmttfHx4YjsoZnVuY3Rpb24oYyl7Yy5tbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLAoobmV3IHhiKGMsdGhpcy5JKSkuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLm1tfHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnE9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuaGs9YjtiLnByb3RvdHlwZT17SXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuaGt8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLklxKDQpOyhmdW5jdGlvbihjKXtjLklsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07CnRoaXMuVihiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuS3MoKX0uYmluZCh0aGlzKSw1MDApfSxLczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFl0OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Lcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwp0aGlzLmtjfHwodGhpcy5rYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5Lcj8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWXQoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLkhsfHxDYjsoZnVuY3Rpb24oYyl7Yy5KbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuSmx8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MdT10aGlzLmFbMV07dGhpcy5mdj10aGlzLmFbNV07CnRoaXMuZXM9dGhpcy5hWzZdO3RoaXMuTHE9dGhpcy5hWzJdO3RoaXMucW49dGhpcy5hWzEwXTt0aGlzLlFvPXRoaXMuYVs0XTt0aGlzLmxzPXRoaXMuYVs5XTt0aGlzLndtPXRoaXMuYVszXTt0aGlzLmpzPXRoaXMuYVsxMF07dGhpcy5XaT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs2XX1jLmRqPWI7Yi5wcm90b3R5cGU9e0t1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLmV2KGEpfSxldjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmVzOnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5McTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucW46dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Rbzp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy52bShhKX0sCnZtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53bTp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpzOnRoaXMuVmkoYSl9LFZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuZGp8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLkt1KDQpOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7CnZhciBHYj1jLkRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5DbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMudnIoKTp0aGlzLmtnKCk7Yi5hdXRvcGxheSYmCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHRvOmZ1bmN0aW9uKCl7dGhpcy5UZigpfHx0aGlzLm0oITApfSx2cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5vYSYmYi5YJiZiLnV3JiZiLnd3JiYodGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2coKX0uYmluZCh0aGlzKSwxMDApfSxtZDpmdW5jdGlvbigpe2lmKCF0aGlzLnZoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy52aD1iW2NdKTtyZXR1cm4gdGhpcy52aH0sUHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5DbHx8SGI7KGZ1bmN0aW9uKGMpe2MuRWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmYoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLkVsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzFdO3RoaXMuSGk9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs5XTt0aGlzLmVyPXRoaXMuYVsxXTt0aGlzLm1xPXRoaXMuYVs1XTt0aGlzLml1PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMud3A9CmI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5obDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5IaTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3I6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMubHEoYSl9LGxxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tcTp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLndwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5nbCg0KTsKKGZ1bmN0aW9uKGMpe2MuS2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5WKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxOdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuQ2MoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxKYzpmdW5jdGlvbigpe3JldHVybiEwfSxJYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuS2t8fFg7KGZ1bmN0aW9uKGMpe2MuSms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLlZ3KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmt8fFk7KGZ1bmN0aW9uKGMpe2MuTGs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5mKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5tYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZigpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBHLExiPWMuTGt8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuZ3U9dGhpcy5hWzJdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzNdO3RoaXMuV3Y9dGhpcy5hWzEwXTt0aGlzLmZqPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLld1PWI7Yi5wcm90b3R5cGU9e2ZzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nczp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3U6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbzp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmo6dGhpcy5WdihhKX0sVnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLld2OnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuV3V8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLmZzKDQpOyhmdW5jdGlvbihjKXtjLlVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksCmEmJmM/KHRoaXMuVihjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LExhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxTdzpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlVqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Uaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudigpLHRoaXMucGEoKSk6KHRoaXMucygiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5PbigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlRqfHxQYjsoZnVuY3Rpb24oYyl7Yy5Waj0KcC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmd2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMoKTtpZihiJiYwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgT2IoYlthXSk7Yy5tYXx8dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgUGIoYyx0aGlzLkkpKS5mKCkpfX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLlZqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Y9dGhpcy5hWzJdO3RoaXMuZm49dGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzhdO3RoaXMueWo9dGhpcy5hWzNdOwp0aGlzLlJzPXRoaXMuYVs4XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs1XX1jLmVrPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hdjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZm46dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLktuOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJzOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmVrfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuQ209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVihhKX1lbHNlIHRoaXMuY2EoKX0sTWQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSwKZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxWczpmdW5jdGlvbigpe3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuU2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlNkfHwodGhpcy5TZD0hMCx0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk1kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKTGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLkNtfHxUYjsoZnVuY3Rpb24oYyl7Yy5CbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxaczpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSl9LCRjOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMucygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxQZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPQowO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuJGMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlBmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuWnMod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5QZigpO3RoaXMuWXMoKX0sWXM6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuVHM/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5Ucz0KITB9fSl9KShjKTt2YXIgVWI9Yy5CbXx8VWI7KGZ1bmN0aW9uKGMpe2MuRG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5WcygpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMuRG18fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuJHI9dGhpcy5hWzldO3RoaXMuUmw9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOV19Yy5zcT1iO2IucHJvdG90eXBlPXtacjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLiRyOnRoaXMuUWwoYSl9LFFsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuc3F8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLlpyKDQpOyhmdW5jdGlvbihjKXtjLmFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5aKGMpLApiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHJ0OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Rcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnloJiYodGhpcy55aD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMuYW18fE87KGZ1bmN0aW9uKGMpe2MuJGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0semE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5EdCgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemEoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuJGx8fFA7KGZ1bmN0aW9uKGMpe2MuYm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYm18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLk5rPWI7Yi5wcm90b3R5cGU9e09pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyICRiPWMuTmt8fCRiLFhjPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLk9pKDQpOyhmdW5jdGlvbihjKXtjLkRrPQp0LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuVihhLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuQ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmc9MDt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLnphPQp0aGlzLldjPSExO3RoaXMuQ2g9ZS5IYigxMCk7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucmIoKSwhMDt0aGlzLlZnKys7aWYoMTA8dGhpcy5WZyl0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5tKCEwKTp0aGlzLm0oKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVoLmJpbmQodGhpcyksMTAwKSwhMX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudmEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/KHRoaXMudigpLHRoaXMucGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Da3x8YWE7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgYWEoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgYWM9Yy5Fa3x8YWMsYmM9bmV3IGFjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5CcD10aGlzLmFbMTBdO3RoaXMudHI9dGhpcy5hWzldO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLmJvPXRoaXMuYVsxMF07dGhpcy5xdD10aGlzLmFbMl07dGhpcy5Qaz10aGlzLmFbN107dGhpcy5Icz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5zaj1iO2IucHJvdG90eXBlPXtBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJwOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50cjp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSmk6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xdDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUGs6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2p8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFwKDQpOyhmdW5jdGlvbihjKXtjLlBqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7CnZhciBkYz1jLlBqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Paj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qZygpfSxqZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuT2p8fGVjOyhmdW5jdGlvbihjKXtjLlFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsKKG5ldyBlYyhiLHRoaXMuSSkpLmYoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuUWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbj10aGlzLmFbNl07dGhpcy5naz10aGlzLmFbOV07dGhpcy5CbD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbMV07dGhpcy5xcj10aGlzLmFbNV07dGhpcy5Gcz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLlNsPWI7Yi5wcm90b3R5cGU9e2NuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kbjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ2s6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJsOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Cbzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLnFyOnRoaXMuRXMoYSl9LEVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuU2x8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmNuKDQpOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5yaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5tZSgpO3RoaXMuZ2coKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSwKZ2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9LG1lOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fApiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMucGl8fGpjOyhmdW5jdGlvbihjKXtjLnNpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMuc2l8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ycT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmZsPWI7Yi5wcm90b3R5cGU9e3FxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuZmx8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnFxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmdoPXRoaXMuaWg9dGhpcy5oaD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjPwpudWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj8KbnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLnVsPWI7Yi5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuVnAoYSk6W10sYjt0aGlzLmloPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmhoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5naClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYKYSBpbnN0YW5jZW9mIHA/ITA6ITF9LFZwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LCR0OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiB0JiYhdGhpcy5oaClmb3IodGhpcy5naD0hMCxhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnlkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMudWx8fG5jLE09bmV3IG5jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNvPXRoaXMuYVs3XTt0aGlzLlF1PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVs3XTt0aGlzLmhuPQp0aGlzLmFbNl07dGhpcy5TdD10aGlzLmFbMV07dGhpcy5Wbj10aGlzLmFbOV07dGhpcy53dT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLnJvPWI7Yi5wcm90b3R5cGU9e1JvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tbzp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUXU6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBtOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5objp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZuOnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5yb3x8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlJvKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkFjKGsuWnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkFjKGsuVXIpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsCiIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmphKCk7SS4kZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuamEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLiRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5qYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2UuQWcod2luZG93LEkuTnEoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTsKZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbN107dGhpcy5nbT10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbNV07dGhpcy5Qdj10aGlzLmFbNF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5Obz10aGlzLmFbMTBdO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuR2w9dGhpcy5hWzddO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy56bD1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Sazp0aGlzLk92KGEpfSxPdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHY6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy54cjp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5vOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR2w6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmRrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy56bHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnpoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy50ZD0wOwp0aGlzLmJiPSIiO3RoaXMuemQ9W107dGhpcy5BZD0wO3RoaXMuQmg9ITE7dGhpcy5aZT1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXt0aGlzLnpoPWF9LGhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdXQ6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx0dDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxLYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubmIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5RcSgpKXRoaXMubmIubCh0aGlzLm5iLm9kLHRoaXMubmIudWEsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuS2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLnpjKTtlbHNlIGlmKHRoaXMuZ3EoKSl0aGlzLm90KGZ1bmN0aW9uKCl7dGhpcy5LYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuY2QsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLApnKTtsLnN0KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5KcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkplJiYoYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnRkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudGQuZ2V0VGltZSgpLHRoaXMudGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnRkPWE7cmV0dXJuITF9LFV0OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMud2coYSkpP3RoaXMuS2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5kZCx0aGlzLnBsYXllci51KCkpKX0sVHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuemgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLnp0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLndnKGMpKT90aGlzLktjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5kZCx0aGlzLnBsYXllci51KCkpKX19LHdnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxidDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkZ0KHRoaXMuVHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5vaCl7dGhpcy5vaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5LYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5kZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxhdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnl0KHRoaXMuRmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuT2UoKX0sZjpmdW5jdGlvbigpe3RoaXMuVXQoKTt0aGlzLnBsYXllci5PZSYmdGhpcy5hdCgpO3RoaXMuYnQoKX0sY3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy56ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuVXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkFkPXRoaXMuemQubGVuZ3RofSxncTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5BZCYmKGE9ITApO3JldHVybiBhfSwKb3Q6ZnVuY3Rpb24oYSl7dGhpcy5CaD1hO2ZvcihhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXVsiZnVuY3Rpb24iXSh0aGlzLk9zLmJpbmQodGhpcykpfSxPczpmdW5jdGlvbihhKXt0aGlzLkFkLS07YSYmdGhpcy5aZS5wdXNoKGEpOzA+PXRoaXMuQWQmJnRoaXMuQmgoKX0sSnI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWmUubGVuZ3RoO2MrKyliPXRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUXQ9dGhpcy5hWzZdO3RoaXMucW09dGhpcy5hWzZdO3RoaXMuQXE9dGhpcy5hWzFdO3RoaXMuZXA9dGhpcy5hWzddO3RoaXMuSm89dGhpcy5hWzRdO3RoaXMuT3Q9dGhpcy5hWzVdO3RoaXMuYmw9CnRoaXMuYVs4XTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuUW09YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlF0OnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xbTp0aGlzLnpxKGEpfSx6cTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXE6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kbzp0aGlzLk50KGEpfSxOdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT3Q6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJsOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUW18fHFjLGVkPW5ldyBxYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5QdCg0KX0pLmNhbGwoc2hvaFZvb25waXVOZWFnaSxzaG9oVm9vbnBpdU5lYWdpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.9.6 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.6.9.76.144.clients.your-server.de
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sun, 29 Sep 2019 01:46:14 GMT
Server
cafe
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
image/gif
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, must-revalidate
Access-Control-Allow-Credentials
true
X-Homad-Instance
de34-homad-2
X-Homad-Url
https://pubads.g.doubleclick.net/activity
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
42
Expires
Fri, 01 Jan 1990 00:00:00 GMT
Cookie set map
ih.adscale.de/ Frame 9B79
0
0
Document
General
Full URL
https://ih.adscale.de/map?format=display&ssl=1
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
ih.adscale.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
uu=00bec60ad57540d3be39c1bd6cf0b680; tu=4#376195185#48~e6070c614041717261f52ff39904d2c9~436033~0~0; ng=2#1157140295#26162026#41728
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Sun, 29 Sep 2019 01:46:14 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:14 GMT
Content-Length
677
Connection
keep-alive
Set-Cookie
tu=4#1294686454#48~e6070c614041717261f52ff39904d2c9~436033~0~0#101~~436033~436033~1#38~~436033~436033~1#39~~436033~436033~1#40~~436033~436033~1#72~~436033~436033~1#42~~436033~436033~1#75~~436033~436033~1#63~~436033~436033~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
nuggad
ih.adscale.de/ Frame 2FA0
Redirect Chain
  • https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=http%3A%2F%2Fwww.giga.de&nuggl=https%3A%2F%2Fih.adscale.de%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYmJiY2Mw%2Fuu%2F00bec60ad...
  • https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/00bec60ad57540d3be39c1bd6cf0b680/ts/1569721574756/v/2/hid/414/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-s...
49 B
491 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/00bec60ad57540d3be39c1bd6cf0b680/ts/1569721574756/v/2/hid/414/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:15 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
49
Expires
Sun, 29 Sep 2019 01:46:15 GMT

Redirect headers

Date
Sun, 29 Sep 2019 01:46:14 GMT
Server
Apache
Status
302 Found
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Location
https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/00bec60ad57540d3be39c1bd6cf0b680/ts/1569721574756/v/2/hid/414/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Cache-Control
no-store,no-cache
Connection
close
Keep-Alive
timeout=3, max=500
Content-Length
0
Expires
Wed, 18 Feb 2009 11:53:30 GMT
sYw
tracker-adserver.ibillboard.com/error/impid/3587f960-7fb5-4072-8178-6da7c2bfc99e/iid/c78eace7-e99e-410e-a2b2-8c6ad498cb9e/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2... Frame 0DC8
0
272 B
Image
General
Full URL
https://tracker-adserver.ibillboard.com/error/impid/3587f960-7fb5-4072-8178-6da7c2bfc99e/iid/c78eace7-e99e-410e-a2b2-8c6ad498cb9e/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/sYw?erc=303
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*, *
Date
Sun, 29 Sep 2019 01:46:14 GMT
Access-Control-Allow-Credentials
true
Server
ibillboard
Connection
keep-alive
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET
tag
a.teads.tv/page/68592/ Frame 0DC8
1 KB
827 B
Script
General
Full URL
https://a.teads.tv/page/68592/tag
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:15 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, must-revalidate, max-age=3600
access-control-allow-credentials
true
content-length
551
expires
Sun, 29 Sep 2019 02:46:15 GMT
teads-format.min.js
a.teads.tv/media/format/v3/
713 KB
186 KB
Script
General
Full URL
https://a.teads.tv/media/format/v3/teads-format.min.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
34647766dde6b04e1840a8d04b37b34fd0887848b2648137d03ea0554bae4747

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:15 GMT
content-encoding
gzip
last-modified
Thu, 26 Sep 2019 14:51:52 GMT
x-amz-request-id
63AB8FB7EE7D6FC4
etag
"fec0446b135887129761d66b3758dfca"
vary
Accept-Encoding
content-type
text/javascript;charset=utf-8
status
200
cache-control
private, must-revalidate, max-age=600
x-bucket
e
accept-ranges
bytes
content-length
189797
x-amz-id-2
aLEewTzIik3a+yuye5EqtTC3pg/BqHuA7s5KRqQDv0O7IAs+oVZHWAoWfJKRk911mx7CyFG+jaI=
expires
Sun, 29 Sep 2019 01:56:15 GMT
index.html
cmp.teads.mgr.consensu.org/ Frame AF24
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

x-amz-id-2
eP74N5mDf2mwuUwz6E0m831egGDvXvr6HEIydDhB20yVDuv4ZE6ina8YQaGiXGlfbz2w11Bw+zo=
x-amz-request-id
93A9209AF986CF84
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Sun, 29 Sep 2019 01:51:15 GMT
Date
Sun, 29 Sep 2019 01:46:15 GMT
Connection
keep-alive
index.html
cmp.teads.mgr.consensu.org/ Frame D63E
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

x-amz-id-2
eP74N5mDf2mwuUwz6E0m831egGDvXvr6HEIydDhB20yVDuv4ZE6ina8YQaGiXGlfbz2w11Bw+zo=
x-amz-request-id
93A9209AF986CF84
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Sun, 29 Sep 2019 01:51:15 GMT
Date
Sun, 29 Sep 2019 01:46:15 GMT
Connection
keep-alive
p2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575247&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575247&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575247&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=53268553&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.214.103 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-214-103.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:15 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Expires
Mon, 01 Jan 1990 00:00:00 GMT

Redirect headers

Location
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575247&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=53268553&cs_ucfr=1
Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:15 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1569721575245&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&fv=105
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Sun, 29 Sep 2019 01:46:15 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sun, 29 Sep 2019 01:46:15 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1569721575246&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=105
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Sun, 29 Sep 2019 01:46:15 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sun, 29 Sep 2019 01:46:15 GMT
content-length
23
content-type
image/gif
p2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575262&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575262&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575262&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=94179775&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.214.103 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-214-103.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:15 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Expires
Mon, 01 Jan 1990 00:00:00 GMT

Redirect headers

Location
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569721575262&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=94179775&cs_ucfr=1
Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:15 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1569721575260&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&fv=105
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Sun, 29 Sep 2019 01:46:15 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sun, 29 Sep 2019 01:46:15 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1569721575261&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&slot=multislot&fv=105
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Sun, 29 Sep 2019 01:46:15 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sun, 29 Sep 2019 01:46:15 GMT
content-length
23
content-type
image/gif
ad
a.teads.tv/page/68592/
118 B
332 B
XHR
General
Full URL
https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=0bb512f4-2329-45c1-86fc-3d3682ffce36&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=127
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a

Request headers

Accept
application/json; charset=UTF-8
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:15 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Sun, 29 Sep 2019 01:46:15 GMT
ad
a.teads.tv/page/68592/
118 B
332 B
XHR
General
Full URL
https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=0bb512f4-2329-45c1-86fc-3d3682ffce36&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=127
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a

Request headers

Accept
application/json; charset=UTF-8
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:15 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Sun, 29 Sep 2019 01:46:15 GMT
iframe
sync.teads.tv/ Frame 79FA
0
0
Document
General
Full URL
https://sync.teads.tv/iframe?pid=73584&userId=0bb512f4-2329-45c1-86fc-3d3682ffce36&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1569721575367
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
akka-http/10.1.5 /
Resource Hash

Request headers

:method
GET
:authority
sync.teads.tv
:scheme
https
:path
/iframe?pid=73584&userId=0bb512f4-2329-45c1-86fc-3d3682ffce36&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1569721575367
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
tt_viewer=ec9579d5-bae9-4a44-af33-3750f9f30de0
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
content-type
text/html; charset=UTF-8
server
akka-http/10.1.5
content-length
1694
expires
Sun, 29 Sep 2019 01:46:15 GMT
cache-control
max-age=0, no-cache, no-store
pragma
no-cache
date
Sun, 29 Sep 2019 01:46:15 GMT
set-cookie
tt_exelate=; Expires=Mon, 30 Sep 2019 01:46:15 GMT; Domain=.teads.tv; SameSite=None tt_bluekai=; Expires=Mon, 30 Sep 2019 01:46:15 GMT; Domain=.teads.tv; SameSite=None tt_emetriq=; Expires=Mon, 30 Sep 2019 01:46:15 GMT; Domain=.teads.tv; SameSite=None tt_liveramp=; Expires=Mon, 30 Sep 2019 01:46:15 GMT; Domain=.teads.tv; SameSite=None tt_neustar=; Expires=Mon, 30 Sep 2019 01:46:15 GMT; Domain=.teads.tv; SameSite=None tt_salesforce=; Expires=Mon, 30 Sep 2019 01:46:15 GMT; Domain=.teads.tv; SameSite=None tt_dar=; Expires=Mon, 30 Sep 2019 01:46:15 GMT; Domain=.teads.tv; SameSite=None
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=adCall&ts=1569721575246&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&gdpr_status=22&gdpr_consent=[gdpr_consent]&gdpr_reason=220&fv=105
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Sun, 29 Sep 2019 01:46:15 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sun, 29 Sep 2019 01:46:15 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=noAd-ivt-doubleVerify&ts=1569721575247&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=105
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Sun, 29 Sep 2019 01:46:15 GMT
cache-control
max-age=0, no-cache, no-store
expires
Sun, 29 Sep 2019 01:46:15 GMT
content-length
23
content-type
image/gif
impl.20190925-18-RELEASE.js
cdn.taboola.com/libtrc/
394 KB
112 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20190925-18-RELEASE.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
63f4f82cf06f230550429133b1cdc57ece980f534134bc947aabbdedb58fb612

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
SiLG3pEQU6AY0ArwqwI0wvQeEAy0aIWv
content-encoding
gzip
etag
"0c930f5c532c1b3d0170c86cf0775ece"
age
21
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
113920
x-amz-id-2
V4una1S+38WYeNuHoiBdU3gt669D9Z2n6URcyBomnryoVYEx+bFtqJN0mm9jqJ7Drv0+zG8q9uY=
x-served-by
cache-hhn4075-HHN
last-modified
Wed, 25 Sep 2019 16:15:26 GMT
server
AmazonS3
x-timer
S1569721576.835012,VS0,VE0
date
Sun, 29 Sep 2019 01:46:15 GMT
vary
Accept-Encoding
x-amz-request-id
DF35975E7341403B
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
16
x-cache-hits
23
beacon.js
sb.scorecardresearch.com/
1 KB
1 KB
Script
General
Full URL
https://sb.scorecardresearch.com/beacon.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.214.103 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-214-103.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
76c393f564f53c19e795307e622edc8657a603f7a816c2646385697286d11313

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:15 GMT
Content-Encoding
gzip
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
private, no-transform, max-age=86400
Connection
keep-alive
Content-Length
902
Expires
Mon, 30 Sep 2019 01:46:15 GMT
b
sb.scorecardresearch.com/
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1569721575866&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.214.103 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-214-103.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:15 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
json
trc.taboola.com/stroeer-smb-giga/trc/3/
11 KB
5 KB
Script
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=03%3A46%3A15.920&lti=deflated&data=%7B%22id%22%3A816%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1569721575913%2C%22cv%22%3A%2220190925-18-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A5164%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-t2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22cd%22%3A3738.296875%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190925-18-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
4b2adcdb881b1bbc657680ff97adfb6d13afa2d73f05376ba09104c43e33e8bb

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:16 GMT
content-encoding
gzip
server
nginx
x-timer
S1569721576.989408,VS0,VE106
status
200
x-served-by
cache-fra19129-FRA
vary
Accept-Encoding
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
*
access-control-allow-credentials
true
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
via
1.1 varnish
x-cache-hits
0
4766719655
api.yieldlove-ad-serving.net/v1/bl/4444/
47 B
297 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/4766719655
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.196.191.159 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-196-191-159.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
0f3c04be1a451827fba137c8600bd690656c3e62bd9f1b7d287bf548fd327fcd

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Sun, 29 Sep 2019 01:46:03 GMT
Cache-control
public, max-age=604800
Connection
keep-alive
X-Key
/bl/4444/4766719655
Transfer-Encoding
chunked
Content-Type
application/json
tb
15.taboola.com/
31 KB
31 KB
Script
General
Full URL
https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&encoded=1&uid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267&variant=-100|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1569721576113&tagid=&cntry=NL&platform=1&sesid=0d4221805fcdc2bf6ad1d7b1dea05fc2&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1569721575913&geolat=&geoing=&deviceifa=&appid=&sd=v2_0d4221805fcdc2bf6ad1d7b1dea05fc2_2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267_1569721575_1569721575_CNawjgYQrMVBGOnTydXXLSABKAEwoQE4l-oLQJ2XEEj41xhQ____________AVgAYAA&ri=ab8411810553b5705de0f05e21ea1042&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
953de0ac288a5b55a2f1dadd6ba86b02592742ec2a178b8aa852b6b6afbe1f4c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569721576.176723,VS0,VE13
machineid
1450
x-cache
MISS
content-type
text/html;charset=ISO-8859-1
status
200
expires
Sat, 26 Jul 1997 05:00:00 GMT
cache-control
no-cache,must-revalidate,no-store,max-age=0,s-maxage=0
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4032-HHN
feed-card-placeholder.20190925-18-RELEASE.es6.js
cdn.taboola.com/libtrc/
5 KB
2 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/feed-card-placeholder.20190925-18-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
e2a97466941bed9a135366275574721a53858ad664eb5a3cc421b1bd75ac687e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
13F12HugkoDoAEbevtlo7dUhWa3GwsQ.
content-encoding
gzip
etag
"7c5c89e6ce3b80925960ccad5e98d794"
age
116
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1290
x-amz-id-2
lDI885T3y8dYFc1p3YIbDnCw7v+8uj/N2NiGgu/G/qLN8G0W44rghkHeMTyg1FSKFLuyI0CVCpE=
x-served-by
cache-hhn4075-HHN
last-modified
Wed, 25 Sep 2019 16:15:46 GMT
server
AmazonS3
x-timer
S1569721576.124840,VS0,VE0
date
Sun, 29 Sep 2019 01:46:16 GMT
vary
Accept-Encoding
x-amz-request-id
9794545DD15AB257
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
89
x-cache-hits
64
f89e1763-220d-4e09-ba69-9e040548fb7a.svg
cdn.taboola.com/static/f8/
4 KB
2 KB
Image
General
Full URL
https://cdn.taboola.com/static/f8/f89e1763-220d-4e09-ba69-9e040548fb7a.svg
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190925-18-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
cMrDKn.emLmm9kiiOOF64ulDT4DRy6LK
content-encoding
gzip
etag
"b8b410e4b18d45aa2f3d9bc09cd335fb"
age
49
via
1.1 varnish
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
LBcEGqARPtb+VMcxyHKLfPRUiFY298K/OcQaUtL8jVoATwJPJ2k7oYgpfGsKlddPOv6r2Pcl4es=
x-served-by
cache-hhn4075-HHN
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1569721576.127247,VS0,VE0
date
Sun, 29 Sep 2019 01:46:16 GMT
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
5BA3698765B9B0CA
access-control-allow-origin
*
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
89
x-cache-hits
17
userx.20190925-18-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20190925-18-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
0eac1ff22bb875d24a2bf43334a1eb91f5a003513545c0aac8f476fb0d66f6b9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
JHhBmeN7fmzvqujbDkst68hJLPnO3TGK
content-encoding
gzip
etag
"7f0e6d37826dfb0c481ba9c167a7101a"
age
69
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
7737
x-amz-id-2
lP9ivZi3tK9ietHCWdsCcvA6ZP5XWHSX1Cyt4g2L2TtH9uhv58freioSOC0FLGP7ZQrOngzyt8g=
x-served-by
cache-hhn4075-HHN
last-modified
Wed, 25 Sep 2019 16:15:52 GMT
server
AmazonS3
x-timer
S1569721576.135248,VS0,VE0
date
Sun, 29 Sep 2019 01:46:16 GMT
vary
Accept-Encoding
x-amz-request-id
92C27F7E59773669
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
89
x-cache-hits
29
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/ Frame C88C
Redirect Chain
  • https://rtb.mfadsrvr.com/sync?ssp=taboola
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=c181106f-0e2a-4145-a396-46e747d96b0a
0
190 B
Image
General
Full URL
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=c181106f-0e2a-4145-a396-46e747d96b0a
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:17 GMT
via
1.1 varnish
server
nginx
x-timer
S1569721577.291658,VS0,VE9
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19129-FRA

Redirect headers

Location
//trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=c181106f-0e2a-4145-a396-46e747d96b0a
Date
Sun, 29 Sep 2019 01:46:17 GMT
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
P3P
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
sync.php
pixel.rubiconproject.com/exchange/ Frame C88C
0
239 B
Image
General
Full URL
https://pixel.rubiconproject.com/exchange/sync.php?p=16698
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_GCM
Server
69.173.144.136 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Expires
0
Cache-Control
no-cache,no-store,must-revalidate
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
X-RPHost
78e3bdce5107450057bade54d54a0a7e
Content-Type
image/gif
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame C88C
Redirect Chain
  • https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D
  • https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=qs5k3k5hJ47461dvhd8MJwuwq27QwwkRG7k7efSWgrY%3D
45 B
94 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=qs5k3k5hJ47461dvhd8MJwuwq27QwwkRG7k7efSWgrY%3D
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 varnish
server
nginx
x-timer
S1569721576.198053,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19129-FRA

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=qs5k3k5hJ47461dvhd8MJwuwq27QwwkRG7k7efSWgrY%3D
Date
Sun, 29 Sep 2019 01:46:16 GMT
Server
nginx
Connection
close
Etag
"qs5k3k5hJ47461dvhd8MJwuwq27QwwkRG7k7efSWgrY="
Content-Length
0
getuidnb
ib.adnxs.com/ Frame C88C
43 B
690 B
Image
General
Full URL
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.173.27 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
539.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:18 GMT
X-Proxy-Origin
109.236.94.21; 109.236.94.21; 539.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.14:80
AN-X-Request-Uuid
4f9483f6-346e-434e-ac80-9d6052a0670a
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
rtb-h
match.taboola.com/sg/google-network/1/ Frame C88C
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc
  • https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEGa30KhSh3IZPEvVJGGA3Rk&google_cver=1
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEGa30KhSh3IZPEvVJGGA3Rk&tbid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267&query=taboola_hm%3DCAESEGa30KhSh3IZPEvVJGGA3Rk%26goo...
0
153 B
Image
General
Full URL
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEGa30KhSh3IZPEvVJGGA3Rk&tbid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267&query=taboola_hm%3DCAESEGa30KhSh3IZPEvVJGGA3Rk%26google_cver%3D1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569721576.265595,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19148-FRA

Redirect headers

date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 varnish
server
nginx
x-timer
S1569721576.179855,VS0,VE8
x-served-by
cache-fra19129-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEGa30KhSh3IZPEvVJGGA3Rk&tbid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267&query=taboola_hm%3DCAESEGa30KhSh3IZPEvVJGGA3Rk%26google_cver%3D1
accept-ranges
bytes
content-length
0
x-cache-hits
0
getuidnb
ib.adnxs.com/ Frame C88C
43 B
690 B
Image
General
Full URL
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.173.27 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
539.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:18 GMT
X-Proxy-Origin
109.236.94.21; 109.236.94.21; 539.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.49:80
AN-X-Request-Uuid
2945975c-cd70-4f4d-98ec-547c1fa6bae7
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
rtb-h
match.taboola.com/sg/thetradedesk-network/1/ Frame C88C
Redirect Chain
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1
  • https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=9595bd3e-8200-4b09-a0ba-5f60fff6555a
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=9595bd3e-8200-4b09-a0ba-5f60fff6555a&tbid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267&query=taboola_hm%3D9595bd3e-8200-4b09...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=9595bd3e-8200-4b09-a0ba-5f60fff6555a&tbid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267&query=taboola_hm%3D9595bd3e-8200-4b09-a0ba-5f60fff6555a
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569721576.265580,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19148-FRA

Redirect headers

date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 varnish
server
nginx
x-timer
S1569721576.213546,VS0,VE8
x-served-by
cache-fra19129-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=9595bd3e-8200-4b09-a0ba-5f60fff6555a&tbid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267&query=taboola_hm%3D9595bd3e-8200-4b09-a0ba-5f60fff6555a
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/storygize-network/1/ Frame C88C
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=8f96a48f-cb16-40f2-971b-a207c767ea2f
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=8f96a48f-cb16-40f2-971b-a207c767ea2f&tbid=fb2510d7-067a-47ea-a7d1-1d442a203fa1-tuct4899269&query=taboola_hm%3D8f96a48f-cb16-40f2-97...
0
76 B
Image
General
Full URL
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=8f96a48f-cb16-40f2-971b-a207c767ea2f&tbid=fb2510d7-067a-47ea-a7d1-1d442a203fa1-tuct4899269&query=taboola_hm%3D8f96a48f-cb16-40f2-971b-a207c767ea2f
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:17 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569721578.978268,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19148-FRA

Redirect headers

date
Sun, 29 Sep 2019 01:46:17 GMT
via
1.1 varnish
server
nginx
x-timer
S1569721578.947645,VS0,VE8
x-served-by
cache-fra19129-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=8f96a48f-cb16-40f2-971b-a207c767ea2f&tbid=fb2510d7-067a-47ea-a7d1-1d442a203fa1-tuct4899269&query=taboola_hm%3D8f96a48f-cb16-40f2-971b-a207c767ea2f
accept-ranges
bytes
content-length
0
x-cache-hits
0
cookiesync
bttrack.com/pixel/ Frame C88C
35 B
380 B
Image
General
Full URL
https://bttrack.com/pixel/cookiesync?source=14b8c562-d12b-418b-b680-ad517d5839ec
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
192.132.33.46 , United States, ASN18568 (BIDTELLECT - Bidtellect Inc., US),
Reverse DNS
46.bidtellect.com
Software
Microsoft-IIS/8.5 /
Resource Hash
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

X-ServerName
Track004-dc3
Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:17 GMT
X-AspNetMvc-Version
5.2
Server
Microsoft-IIS/8.5
X-AspNet-Version
4.0.30319
P3P
CP="CAO DSP COR ADMo DEVo PSAo PSDo HISo IVAo IVDo OUR IND OTC"
Cache-Control
private,no-cache
Content-Type
image/gif
Content-Length
35
Expires
-1
/
cds.taboola.com/ Frame C88C
0
293 B
Image
General
Full URL
https://cds.taboola.com/?uid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267&_r=5480473
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
130.211.13.252 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
252.13.211.130.bc.googleusercontent.com
Software
nginx/1.12.2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:17 GMT
Via
1.1 varnish
Server
nginx/1.12.2
X-Timer
S1569721577.468927,VS0,VE11
X-Served-By
cache-dca17720-DCA
X-Cache
MISS
x-envoy-upstream-service-time
2
Connection
close
Accept-Ranges
bytes
Content-Length
0
X-Cache-Hits
0
rtb-h
match.taboola.com/sg/bidswitch-network/1/ Frame C88C
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://u.ipw.metadsp.co.uk/sync?ssp=bidswitch&bidswitch_ssp_id=taboola&bsw_user_id=e7a3b43e-fcad-4b52-8744-f064ce91becf&bsw_param=e7a3b43e-fcad-4b52-8744-f064ce91becf
  • https://u.ipw.metadsp.co.uk/ul_cb/sync?ssp=bidswitch&bidswitch_ssp_id=taboola&bsw_user_id=e7a3b43e-fcad-4b52-8744-f064ce91becf&bsw_param=e7a3b43e-fcad-4b52-8744-f064ce91becf
  • https://x.bidswitch.net/sync?dsp_id=339&expires=14&user_group=1&user_id=414e86be-62e2-41c8-ac6c-0baa474a8f97&ssp=taboola&bsw_param=e7a3b43e-fcad-4b52-8744-f064ce91becf
  • https://x.bidswitch.net/ul_cb/sync?dsp_id=339&expires=14&user_group=1&user_id=414e86be-62e2-41c8-ac6c-0baa474a8f97&ssp=taboola&bsw_param=e7a3b43e-fcad-4b52-8744-f064ce91becf
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=77929f75-6d0f-440b-acfa-db0821abaa5e
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=77929f75-6d0f-440b-acfa-db0821abaa5e&tbid=fb2510d7-067a-47ea-a7d1-1d442a203fa1-tuct4899269&query=taboola_hm%3D77929f75-6d0f-440b-ac...
0
76 B
Image
General
Full URL
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=77929f75-6d0f-440b-acfa-db0821abaa5e&tbid=fb2510d7-067a-47ea-a7d1-1d442a203fa1-tuct4899269&query=taboola_hm%3D77929f75-6d0f-440b-acfa-db0821abaa5e
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:19 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569721580.649744,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19148-FRA

Redirect headers

date
Sun, 29 Sep 2019 01:46:19 GMT
via
1.1 varnish
server
nginx
x-timer
S1569721580.615331,VS0,VE8
x-served-by
cache-fra19129-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=77929f75-6d0f-440b-acfa-db0821abaa5e&tbid=fb2510d7-067a-47ea-a7d1-1d442a203fa1-tuct4899269&query=taboola_hm%3D77929f75-6d0f-440b-acfa-db0821abaa5e
accept-ranges
bytes
content-length
0
x-cache-hits
0
collect
www.google-analytics.com/
35 B
99 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=385468335&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=409114290.1569721572&tid=UA-204785-4&_gid=1493277083.1569721572&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cm73=1&cm13=1&z=866891532
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 23:49:17 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2167019
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
98 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190925-18-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 varnish
server
nginx
x-timer
S1569721576.152869,VS0,VE9
x-served-by
cache-fra19129-FRA
status
204
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
content-type
image/gif
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
54 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190925-18-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 varnish
server
nginx
x-timer
S1569721576.154529,VS0,VE9
x-served-by
cache-fra19129-FRA
status
204
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
content-type
image/gif
x-cache-hits
0
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
652 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
hL.cyLD7Q4TL5ceY.7JQwF9m5IYI8mkC
via
1.1 varnish
etag
"dfa7b52c86e56bd67fa4002f6ed19854"
age
8283
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
grODyaFUyHwi27S6u2hd746yPHwUf+y1im5Wn93DxT7wozhn8KMFUP712WAAG3eD1t2rnF4k3Bs=
x-served-by
cache-hhn4075-HHN
last-modified
Wed, 24 Jun 2015 07:14:11 GMT
server
AmazonS3
x-amz-meta-s3cmd-attrs
uid:0/gname:root/uname:root/gid:0/mode:33188/mtime:1377415166/atime:1435052450/md5:dfa7b52c86e56bd67fa4002f6ed19854/ctime:1422381567
x-timer
S1569721576.169589,VS0,VE0
date
Sun, 29 Sep 2019 01:46:16 GMT
x-amz-request-id
29D722C296265892
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
89
x-cache-hits
2958
creative_js.js
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
4 KB
2 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 a436b6df4b0d1bd189edf722b5d2a523.cloudfront.net (CloudFront), 1.1 varnish
age
1209207
x-amz-meta-mtime
1499351521
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
1827
x-served-by
cache-fra19129-FRA
last-modified
Wed, 06 Sep 2017 08:46:00 GMT
server
AmazonS3
x-timer
S1569721576.239678,VS0,VE0
etag
"0df6cb700db4e2c8b3b7dcb734e91cb0"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
Bz1oMGf3im0GdaDR1lpP366TMdyCBt5NXOq1IlamWrJqJW2zqe6XsA==
x-cache-hits
1851890
st
imprammp.taboola.com/ Frame 43CA
0
0
Document
General
Full URL
https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=52864A3A391661297341746682574&cicmp=1657475&cijs=1&dast=V7lNgCFgO1D0dat13hJwS1D0dat13hJwUAAAAGBvQHHDUZzkYLzoKzXMxmi8lyt9lMZovZZrCZbaYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDJgeB-v-nktxz-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VMOOzkP9XyJGVKBaxAgAAACgjd2r4mhSJ1QWVQAABOlWAFcAAAFterJq9Vm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTQhKBT0NiDGWWO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA4GRaTJZDAermcfksUxstoXJMfJNHCOXw7CaeSzbw07pXkLT4DPsGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-BGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhJGVYzGyOFxumW9icYtWk5lbYdlY3KLBcDNzOSe7mWvhFr0-ptNwuZzMdlsUDKjai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8LINJkshoPVzGPyWCY228LkGPkmjpHLYVjNPJZ9ZeVYjCwOl1vmm1jcotVk5lZYNha3aDDczFzOyW7mWrhFr4_pNFwuJ7PdvrGaLXeTxWq32jdWs-VusljtVvsOneG7-pyNyptW4fHppubJWCxzGhQug8X7O1qksVtvZlQpwxaLaloMj45-v9_v9_v9fr_fb9B6DmaDQRFLBKeLdCJ6GU8XsUTytEgnCotxtFgMF4PVajNx7QarkcswM6xWlsXK4RiMJhOxRGm6SCd63cviMBw-f8HDeXiY_aKn4fD5Cx7Ow8PsFvt9Trtb83frXEbT5626m9yav1vsd3lOb6XR8hb7fU67W3D5W8wut8ui_mNDDJZzyWY2V47mksUqAQAAAAAAAAAsYc68CQAAAMBpIIvFYLJYLgCEGOsuwadUyKMT-Ftx48cQc7r8XS7LW_O2uHVOn8PKABI7BQ!&excid=22&tst=1&docw=0
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash

Request headers

:method
GET
:authority
imprammp.taboola.com
:scheme
https
:path
/st?cipid=8045671&ttype=0&cirid=52864A3A391661297341746682574&cicmp=1657475&cijs=1&dast=V7lNgCFgO1D0dat13hJwS1D0dat13hJwUAAAAGBvQHHDUZzkYLzoKzXMxmi8lyt9lMZovZZrCZbaYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDJgeB-v-nktxz-AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VMOOzkP9XyJGVKBaxAgAAACgjd2r4mhSJ1QWVQAABOlWAFcAAAFterJq9Vm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTQhKBT0NiDGWWO0XEABg7RcQAIBN3QAA3gTggo6gFYPB6gxishntJrMDAAAAuPv____XA4GRaTJZDAermcfksUxstoXJMfJNHCOXw7CaeSzbw07pXkLT4DPsGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-BGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhJGVYzGyOFxumW9icYtWk5lbYdlY3KLBcDNzOSe7mWvhFr0-ptNwuZzMdlsUDKjai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8LINJkshoPVzGPyWCY228LkGPkmjpHLYVjNPJZ9ZeVYjCwOl1vmm1jcotVk5lZYNha3aDDczFzOyW7mWrhFr4_pNFwuJ7PdvrGaLXeTxWq32jdWs-VusljtVvsOneG7-pyNyptW4fHppubJWCxzGhQug8X7O1qksVtvZlQpwxaLaloMj45-v9_v9_v9fr_fb9B6DmaDQRFLBKeLdCJ6GU8XsUTytEgnCotxtFgMF4PVajNx7QarkcswM6xWlsXK4RiMJhOxRGm6SCd63cviMBw-f8HDeXiY_aKn4fD5Cx7Ow8PsFvt9Trtb83frXEbT5626m9yav1vsd3lOb6XR8hb7fU67W3D5W8wut8ui_mNDDJZzyWY2V47mksUqAQAAAAAAAAAsYc68CQAAAMBpIIvFYLJYLgCEGOsuwadUyKMT-Ftx48cQc7r8XS7LW_O2uHVOn8PKABI7BQ!&excid=22&tst=1&docw=0
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
t_gid=2e11dbae-f7bb-452f-a2cb-4083fe927f5a-tuct4899267
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
accept-ranges
bytes
date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 varnish
x-served-by
cache-hhn4032-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1569721576.266627,VS0,VE11
cmTagFEED_MANAGER.js
vidstat.taboola.com/vpaid/units/23_14_8/infra/
762 KB
179 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/23_14_8/infra/cmTagFEED_MANAGER.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
9f6b492f26b70363433c27e9e286ee717f90ee9b53b127c504416e9544dc3519

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 b16802a1e349d80b7688070778305ae2.cloudfront.net (CloudFront), 1.1 varnish
age
300686
x-amz-meta-mtime
1569419520
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1569419555
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
182935
x-served-by
cache-fra19129-FRA
last-modified
Wed, 25 Sep 2019 13:52:37 GMT
server
AmazonS3
x-timer
S1569721576.269336,VS0,VE0
etag
"11701f4b105c13bae43a8a3486ea1f04"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
RIbCb9EodxDDnFhvh4xJKXp3Tlili28wg7Puxrh5qB8W2WEckRxQUg==
x-cache-hits
377167
cmOsUnit.css
vidstat.taboola.com/vpaid/units/23_14_8/assets/css/
34 KB
6 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/units/23_14_8/assets/css/cmOsUnit.css
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:16 GMT
via
1.1 660f4277d8fbef27985e8a4a97e362cc.cloudfront.net (CloudFront), 1.1 varnish
age
300685
x-amz-meta-mtime
1569419518
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1569419531
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
6240
x-served-by
cache-fra19129-FRA
last-modified
Wed, 25 Sep 2019 13:52:13 GMT
server
AmazonS3
x-timer
S1569721576.269415,VS0,VE0
etag
"1112e8ccb1e3ed0d2e59d31564a5dfae"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
bZAsFQ_-v4Cnx-aZU5aDvxRDuxB_caf2nZA4B73mhLv5WrAcjIiDjg==
x-cache-hits
566330
pd
eu-u.openx.net/w/1.0/ Frame 3FBB
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.0 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
i=187b2825-b5bf-02ff-1752-f6f0d0cb10a8|1569721572; pd=v2|1569721573|mOkimWiygu
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
vary
Accept
set-cookie
i=187b2825-b5bf-02ff-1752-f6f0d0cb10a8|1569721572; Version=1; Expires=Mon, 28-Sep-2020 01:46:16 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1569721573.3|kimWiymOgu.fcgqsLn0oagi; Version=1; Expires=Mon, 14-Oct-2019 01:46:16 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.163.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Sun, 29 Sep 2019 01:46:16 GMT
content-type
text/html
content-length
478
via
1.1 google
alt-svc
clear
Cookie set showad.js
ads.pubmatic.com/AdServer/js/ Frame 6471
0
0
Document
General
Full URL
https://ads.pubmatic.com/AdServer/js/showad.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.180 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-180.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) /
Resource Hash

Request headers

Host
ads.pubmatic.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Last-Modified
Fri, 26 Jul 2019 09:39:45 GMT
ETag
"13006b6-9bf6-58e925294ef26"
Server
Apache/2.2.15 (CentOS)
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
Accept-Ranges
bytes
Content-Encoding
gzip
P3P
CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC", CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC"
Content-Length
14898
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=27104
Expires
Sun, 29 Sep 2019 09:18:00 GMT
Date
Sun, 29 Sep 2019 01:46:16 GMT
Connection
keep-alive
Vary
Accept-Encoding
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 97D8
0
0
Document
General
Full URL
https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.113.108 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx/1.9.13
Content-Type
text/html
Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Expires
Sun, 06 Aug 2017 09:41:59 GMT
Cache-Control
max-age=31536000
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Via
1.1 varnish 1.1 varnish
Fastly-Debug-Digest
e0a1bb88354655bae6b4f44be1ff58238053e5563770e29e0e433e905ee66055
Content-Length
506
Accept-Ranges
bytes
Date
Sun, 29 Sep 2019 01:46:17 GMT
Age
4637062
Connection
keep-alive
X-Served-By
cache-jfk8123-JFK, cache-hhn4042-HHN
X-Cache
HIT, HIT
X-Cache-Hits
1276778, 5096808
X-Timer
S1569721578.779944,VS0,VE0
Vary
Accept-Encoding
usync.html
eus.rubiconproject.com/ Frame D5EA
0
0
Document
General
Full URL
https://eus.rubiconproject.com/usync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.108.40.167 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-108-40-167.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) / PHP/5.3.3
Resource Hash

Request headers

Host
eus.rubiconproject.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Apache/2.2.15 (CentOS)
X-Powered-By
PHP/5.3.3
p3p
CP="NOI CURa ADMa DEVa TAIa OUR # BUS IND UNI COM NAV INT"
Last-Modified
Fri, 27 Sep 2019 17:49:20 GMT
Content-Encoding
gzip
Content-Length
7689
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=49114
Expires
Sun, 29 Sep 2019 15:24:52 GMT
Date
Sun, 29 Sep 2019 01:46:18 GMT
Connection
keep-alive
Vary
Accept-Encoding
submit
lb97.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb97.s400.meetrics.net/bb-mx/submit?/YvsNBWAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSzbBPAAAAAAAAAOAAAAGDAAAAAAZwSzbBBRksFAQtjFlLr9SA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:19 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Sun, 29 Sep 2019 01:46:18 GMT
data
lb97.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb97.s400.meetrics.net/data?/YvsNCXAAATkzFARksFAQtjFuvJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:19 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 29-Sep-19 01:46:18 GMT
api
tracking.m6r.eu/sync/
Redirect Chain
  • https://cdn.m6r.eu/sync/api
  • https://tracking.m6r.eu/sync/api?checkcookies=true
1 KB
1 KB
Script
General
Full URL
https://tracking.m6r.eu/sync/api?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:19 GMT
Content-Encoding
gzip
Last-Modified
Mon, 16 Sep 2019 12:52:12 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654

Redirect headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:19 GMT
Server
nginx
Vary
Accept
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/api?checkcookies=true
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
72
Expires
Sun, 29 Sep 2019 01:46:19 GMT
Cookie set /
d.agkn.com/iframe/8613/ Frame 8B02
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=432523018&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.148.3 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-148-3.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
d.agkn.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Cache-Control
no-cache, must-revalidate
Content-Type
text/html;charset=UTF-8
Date
Sun, 29 Sep 2019 01:46:20 GMT
Expires
Sat, 01 Jan 2000 00:00:00 GMT
P3P
CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Pragma
no-cache
Server
Apache-Coyote/1.1
Set-Cookie
ab=0001%3AGSiCDHZZHkjLbsmTUIHNya%2BQhV%2Bts4kG;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlIslsJSLJbAAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
482
Connection
keep-alive
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n2=3&n3=1&n4=3&n5=3&n6=2&n7=1&n8=1&n9=3&n10=2&n11=1&n12=1&n17=4&n18=2&n20=2&n21=4&n22=4&n39=4&n43=4&n44=3&n46=4&n47=4&n48=4&n55=4&n57=4&n60=3&n67=1&n75=0&n76=1&n77=0&n78=0&n79=1&n80=0&n81=0&n82=0&n83=0&n84=0&n85=0&n86=0&n87=0&n88=1&n117=4&n118=3&n119=6&n120=2&n121=1&n122=1&n123=2&n127=0&n128=1&n133=1&n95=1&n96=1&n135=9&n15=1&n66=1&n89=1&n90=1&n91=1&n92=3&n93=4&n94=2&n97=1&n98=1&n101=1&n104=1&n106=1&n108=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n148=1&n149=1&n154=1&n155=1&n156=1&n158=1&n159=1&n161=1
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
eedbd451b568034845c1ed016b076207ba44e546a71a4b231f3b4dcd32edcd7c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:19 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1514
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=fe38a3918cedb0bb2d0c36baef772894&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Dfe38a3918cedb0bb2d0c36baef772894%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=fe38a3918cedb0bb2d0c36baef772894&userId=adscale-user:a1806aa1487f4dc18892c53b78372265
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=fe38a3918cedb0bb2d0c36baef772894&userId=adscale-user:a1806aa1487f4dc18892c53b78372265
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:20 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:19 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=fe38a3918cedb0bb2d0c36baef772894&userId=adscale-user:a1806aa1487f4dc18892c53b78372265
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Sun, 29 Sep 2019 01:46:19 GMT
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=fe38a3918cedb0bb2d0c36baef772894
0
590 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=fe38a3918cedb0bb2d0c36baef772894
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.173.27 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
539.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:22 GMT
X-Proxy-Origin
109.236.94.21; 109.236.94.21; 539.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.228:80
AN-X-Request-Uuid
df88e94a-1555-444d-b47e-1612617eafd7
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=fe38a3918cedb0bb2d0c36baef772894
Date
Sun, 29 Sep 2019 01:46:19 GMT
Server
nginx
Connection
keep-alive
Content-Type
text/plain; charset=utf-8
Content-Length
98
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=_jijkYztsLstDDa673colA
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=_jijkYztsLstDDa673colA&google_tc=
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
523 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:20 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:20 GMT
server
HTTP server (unknown)
status
302
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
260
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
m
ad.yieldlab.net/
Redirect Chain
  • https://tracking.m6r.eu/sync/yieldlabRedirect
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=fe38a3918cedb0bb2d0c36baef772894
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=fe38a3918cedb0bb2d0c36baef772894
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.16.122.151 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-16-122-151.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:20 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sat, 28 Sep 2019 01:46:20 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=fe38a3918cedb0bb2d0c36baef772894
Date
Sun, 29 Sep 2019 01:46:19 GMT
Server
nginx
Connection
keep-alive
Content-Type
text/plain; charset=utf-8
Content-Length
99
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
pixel
tracking.m6r.eu/consent/
44 B
209 B
Image
General
Full URL
https://tracking.m6r.eu/consent/pixel?nocookie=true&nosync=true&consent=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:20 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
11 KB
11 KB
Fetch
General
Full URL
https://gocp.stroeermediabrands.de/absconf/www.giga.de/config.json
Requested by
Host: gocp.stroeermediabrands.de
URL: https://gocp.stroeermediabrands.de/trackcp.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.16.106 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.106.16.40.188.clients.your-server.de
Software
/
Resource Hash
ab14dda727a817a3af499421678261abfee56b136a6ff723917bd2c5b1b8de76

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Sun, 29 Sep 2019 01:46:21 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Transfer-Encoding
chunked
Content-Type
application/json; charset=UTF-8
ngx_pagespeed_beacon
www.giga.de/
0
73 B
XHR
General
Full URL
https://www.giga.de/ngx_pagespeed_beacon?url=http%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

status
204
date
Sun, 29 Sep 2019 01:46:21 GMT
cache-control
max-age=0, no-cache
server
nginx
t.png
gocp.stroeermediabrands.de/
98 B
355 B
Image
General
Full URL
https://gocp.stroeermediabrands.de/t.png?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&contentPieceId=2857946&publishDate=2016-09-22T12%3A38%3A19%2B02%3A00&_=1569721581779.1094851623
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.16.106 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.106.16.40.188.clients.your-server.de
Software
/
Resource Hash
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:21 GMT
Last-Modified
Thu, 19 Sep 2019 14:13:24 GMT
ETag
"5d838d04-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Content-Length
98
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
dkfVZvfV0gdhc2R5a4arQG6Eo23V0d6t
Content-Encoding
gzip
Last-Modified
Thu, 05 Sep 2019 23:46:38 GMT
Server
AmazonS3
x-amz-request-id
F3CF296B6B687F4C
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Sun, 29 Sep 2019 01:46:21 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
tdB8iwFVUBitEppudMtOYVuPFlxKY6UoIOt5HwK0LNw3WJ2m39xkETrDkULkLLY7i0nOE/vXSP4=
adex.js
dmp.theadex.com/d/285/5184/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/285/5184/s/adex.js?ts=48365234
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.117 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:21 GMT
content-encoding
gzip
last-modified
Fri, 05 Jul 2019 13:52:02 GMT
server
nginx
etag
W/"5d1f5602-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Sun, 29 Sep 2019 01:51:21 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
1 KB
1014 B
Script
General
Full URL
https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
194.213.222.29 Hrusovany u Brna, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn4.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Sun, 29 Sep 2019 01:46:21 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 18:52:32 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Sat, 05 Oct 2019 12:18:08 GMT
default.js
ups.xplosion.de/loader/69511/
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/69511/default.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.164.155 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Sun, 29 Sep 2019 01:46:21 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
text/javascript
content-length
1687
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
495 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=34226379&src.id=Stroeer
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.186.238.175 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
175.238.186.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:21 GMT
via
1.1 google
server
Apache
p3p
CP="NON DSP COR NID CURa PSAa PSDa OUR STP UNI COM NAV STA LOC OTC",policyref="/w3c/p3p.xml"
status
200
cache-control
no-cache, no-store, must-revalidate
content-type
image/gif;charset=UTF-8
alt-svc
clear
content-length
43
x-application-context
application
expires
Thu, 01 Jan 1970 00:00:00 GMT
launcher.js
sak.userreport.com/sdm/
58 KB
18 KB
Script
General
Full URL
https://sak.userreport.com/sdm/launcher.js
Requested by
Host: si.nuggad.net
URL: https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.22 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-22.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6c5a863192d8b1a82f9a0fb550c45f778d42b8af36fc921045a055389062edad

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
cj2VE0YVfLxhuffg0VJh8ccads9KhSqM
content-encoding
gzip
last-modified
Thu, 26 Sep 2019 14:50:20 GMT
server
AmazonS3
age
18
date
Sun, 29 Sep 2019 01:46:20 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=300
x-amz-cf-pop
FRA53-C1
x-amz-cf-id
Ct5mf-hvDJS5Y6feiB6Lxo7YMWVeJnoAhFownY6c1NNwuWJr_ZWF-A==
via
1.1 89cb19c6f2c9ed0983294d3b12e80e43.cloudfront.net (CloudFront)
nid
ap-sync.nuggad.net/
0
274 B
Image
General
Full URL
https://ap-sync.nuggad.net/nid?nid=
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:214f:6600:12:6213:9cc0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 28 Sep 2019 10:08:30 GMT
via
1.1 d16428714e022976873ccc980fdc1289.cloudfront.net (CloudFront)
server
nginx/1.14.1
age
56271
x-cache
Hit from cloudfront
status
204
cache-control
s-maxage=86400, max-age=0
access-control-allow-credentials
true
x-amz-cf-pop
FRA53-C1
x-amz-cf-id
rUiRmxVDRXy1SsI-0mj48WaNvDGdqPsjWoiEcJg-31XFdKZuQZHFGQ==
segments
api.theadex.com/v0.9/pub/
56 B
126 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
89.163.159.124 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Sun, 29 Sep 2019 01:46:22 GMT
content-length
56
content-type
text/plain; charset=utf-8
p.min.js
cdn.emetriq.de/adp/profiling/0.2.18/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/69511/default.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:214f:1e00:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 25 Sep 2019 11:24:11 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
310932
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
fTNde0ZXM.BzDu33z6pL5eJgKGxahMla
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA53-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
gVjuhkdnAo_q5OQXcEvGbDwxwq62uz_wiG9gPxD_bPHvToEQ4XCKRA==
via
1.1 85dc19f43b2a0bd8840fdf8baf07d762.cloudfront.net (CloudFront)
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-2&screen=1200x1600&mbr=e6070c614041717261f52ff39904d2c9&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=412812769952
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.164.155 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
2a5b4cc141c383bb48c75951f13c333ba48bf1391b699e666a92ef4f1be1c83d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 29 Sep 2019 01:46:22 GMT
content-encoding
gzip
status
200
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
access-control-allow-origin
*
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.250.43.132 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-250-43-132.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 16:55:35 GMT
Content-Encoding
gzip
Last-Modified
Tue, 24 Sep 2019 16:54:35 GMT
Server
akka-http/10.1.9
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
usersync
uss.xplosion.de/ Frame D220
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCESRkBSa3BDfkBDUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4205224686072324599
42 B
662 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4205224686072324599
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.164.155 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Sun, 29 Sep 2019 01:46:23 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"

Redirect headers

pragma
no-cache
date
Sun, 29 Sep 2019 01:46:23 GMT
server
nginx
status
307
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4205224686072324599
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1569721582384&__it=-120&__ic=727391&__iq=96e9a9f8958d4a7cb97aa9929666d762&__ig=1
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:22 GMT
Last-Modified
Mon, 21 Sep 2009 01:44:32 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Sun, 23 Sep 2012 01:44:32 GMT
usersync
uss.xplosion.de/
42 B
662 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=e6070c614041717261f52ff39904d2c9
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.164.155 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Sun, 29 Sep 2019 01:46:22 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
activation
adstax-match.adrtx.net/ Frame 44FC
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.248.95.73 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-248-95-73.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Sun, 29 Sep 2019 01:46:23 GMT
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
data
lb97.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb97.s400.meetrics.net/data?/YvsNDNOBAKktFLkqFFlqwF23A52AwwALl1FDLkqFKlkyB23A52AwwA2qoFx1A25A3yAx1A3xA5yAy5E13BroFmuFnnF5BFTkzFPPvgAAZAwSAcAAAARksFAQtjFb/VPSA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 29 Sep 2019 01:46:24 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 29-Sep-19 01:46:23 GMT

Failed requests

These URLs were requested, but there was no response received. You will also see them in the list above.

Domain
prg.smartadserver.com
URL
https://prg.smartadserver.com/prebid/v1
Domain
prg.smartadserver.com
URL
https://prg.smartadserver.com/prebid/v1
Domain
prg.smartadserver.com
URL
https://prg.smartadserver.com/prebid/v1
Domain
as-sec.casalemedia.com
URL
https://as-sec.casalemedia.com/cygnus?s=254711&v=7.2&r=%7B%22id%22%3A%2213743d3f5b54f2d%22%2C%22imp%22%3A%5B%7B%22id%22%3A%2214cfa1ffa001ba2%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22254711%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%221520acc73660b46%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%22169f20d6e05b33f%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2217d4e45ad6d029c%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2218a65c57db31fc7%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2219534b0a43e67c7%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22202094c7ab07c15%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%2221a2ac71a2e70b5%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22222023d3443648f%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
Domain
hbopenbid.pubmatic.com
URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
Domain
fastlane.rubiconproject.com
URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=750960&size_id=15&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=ef93a1a3-b0e8-4e71-86e9-408e2b613216&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.589208629617308
Domain
fastlane.rubiconproject.com
URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1266838&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=481cb0c6-a6f0-49f4-8b5c-dafdf0cdf2a0&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.8127318914694583
Domain
fastlane.rubiconproject.com
URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1408756&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=bd8d4e19-f203-4888-8169-515153069058&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.35585571720762776
Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid
Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid
Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid

Verdicts & Comments Add Verdict or Comment

203 JavaScript Global Variables

These are the non-standard "global" variables defined on the window object. These can be helpful in identifying possible client-side frameworks and code.

object| onformdata object| onpointerrawupdate object| smbContext object| LUX object| POST_META object| smbt function| b2serp object| smbadloader function| requirejs function| require function| define string| GoogleAnalyticsObject function| ga function| adLoader object| apstag boolean| smbt_only object| DKUIM_SETTINGS string| GIGA_AREA string| WP_SITEURL string| SHUTTLE_CORE_VIDEO_CDN_VIDEO_URL string| SHUTTLE_API_URL string| VIDEO_INLINE_MODE boolean| VIDEO_AUTOPLAY_DISABLED function| st_cookie object| is number| USER_PAGE_COUNT string| szmvars object| iom object| smbVideoService object| iam_data object| pagespeed object| adsbygoogle number| LUX_t_start number| LUX_t_end object| gaLog string| type function| sdibgclick object| _absconfig object| _ecoconf function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| setUpAgknTag object| google_js_reporting_queue number| google_srt object| google_ad_modifications object| google_logging_queue object| ggeac boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| google_reactive_ads_global_state object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad number| _gfp_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| dataLayer function| _ object| _econa function| send function| setImmediate function| clearImmediate boolean| apstagLOADED object| _taboola object| google_tag_manager function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator number| __google_ad_urls_id object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired object| closure_memoize_cache_ object| google_optimize function| $ function| jQuery function| isEmpty object| gapi object| ___jsl function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| core function| pbjsYLHHChunk function| webpackJsonpdkuim object| Base64 boolean| dkuimInited boolean| google_noFetch object| nativendo_588f272a3e49c_conf object| confiant object| stroeerCore function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c string| preloadType string| sdm_ift object| nativendo_588f272a3e49c_map function| stroeerCoreConnect object| teadsscript object| teads object| TRC object| _tblConsole undefined| msg object| _comscore function| udm_ object| ns_p object| COMSCORE function| __trcCopyProps function| __trcFromError function| __trcClientTimestamp function| __trcLog function| __trcError function| __trcDebug function| __trcInfo function| __trcWarn function| __trcDOMWalker function| __trcPurgeEventHandlers function| __trcJSONify function| __trcUnJSONify function| __trcGetMargins function| __trcAttachResize function| __trcDetachResize function| __trcTrim function| __trcGetElementsByClass function| __trcToArray function| __trcObjectCreate function| PageManager function| addHashParam object| params number| trc_debug_level string| trc_article_id object| TRCImpl number| taboola_view_id object| trcManager object| trcRbox object| options object| cmTag function| startCMTagMain object| de_meetrics object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| _m6rq function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet number| _m6rApiLoaded object| _m6rOnce number| _m6rContainerLoaded object| cp2 function| _h object| _adexc object| adex string| apsrc object| ibb_lib object| _EQLService object| _EQPScript object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr object| audienceProjectLayer

14 Cookies

Domain/Path Name / Value
.agkn.com/ Name: ab
Value: 0001%3AGSiCDHZZHkjLbsmTUIHNyTR%2F3qtgtKyGHcXJu2ftvkdHjoJLR6mljg%3D%3D
.pubmatic.com/ Name: KRTBCOOKIE_377
Value: 6810-fbcee6a2-a82c-4b20-9ef3-ac62416fe1bb&KRTB&22918-fbcee6a2-a82c-4b20-9ef3-ac62416fe1bb&KRTB&23031-fbcee6a2-a82c-4b20-9ef3-ac62416fe1bb
.pubmatic.com/ Name: KRTBCOOKIE_734
Value: 15208-uid:fb2510d7-067a-47ea-a7d1-1d442a203fa1-tuct4899269&KRTB&23151-uid:fb2510d7-067a-47ea-a7d1-1d442a203fa1-tuct4899269
.pubmatic.com/ Name: PugT
Value: 1569721581
.agkn.com/ Name: u
Value: C|0AEAlIslsJSLJbAAAAAAAAg1RAQCADVIBAIA
.pubmatic.com/ Name: KRTBCOOKIE_153
Value: 19420-mvEDZp_2XzKCo1xizvEXYJz3DGGC9w1hn6dyP8dA&KRTB&22979-mvEDZp_2XzKCo1xizvEXYJz3DGGC9w1hn6dyP8dA
.pubmatic.com/ Name: SPugT
Value: 1569721580
.pubmatic.com/ Name: KRTBCOOKIE_466
Value: 16530-77929f75-6d0f-440b-acfa-db0821abaa5e&KRTB&16532-77929f75-6d0f-440b-acfa-db0821abaa5e
.pubmatic.com/ Name: KRTBCOOKIE_391
Value: 22924-3438353706940256629
.pubmatic.com/ Name: KRTBCOOKIE_336
Value: 5844-4100477126747214854
.pubmatic.com/ Name: KRTBCOOKIE_80
Value: 16514-CAESEBh0qEyxKS8cLlN7IEIVjJ0&KRTB&22987-CAESEBh0qEyxKS8cLlN7IEIVjJ0&KRTB&22995-CAESEBh0qEyxKS8cLlN7IEIVjJ0
.pubmatic.com/ Name: KRTBCOOKIE_22
Value: 14911-3512611732696622205&KRTB&16087-3512611732696622205&KRTB&23049-3512611732696622205&KRTB&23150-3512611732696622205
.pubmatic.com/ Name: PUBMDCID
Value: 3
.doubleclick.net/ Name: IDE
Value: AHWqTUl7eGq2h7cyEpRsVDb2jGzmWT3QMovGQ3U8Hcz9llRr34sO0KWVNPm_o6ku

6 Console Messages

Source Level URL
Text
console-api log URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
starting version 20181002
console-api log URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js(Line 15)
Message:
getPageCorrelator undefined
console-api log URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js(Line 15)
Message:
getPageCorrelator 2472101747094926
console-api error URL: https://c.amazon-adsystem.com/aax2/apstag.js(Line 2)
Message:
Error: `apstag.init` was called multiple times
console-api log (Line 108)
Message:
inline_ad: No video available; loading inline-ad by Teads
console-api info URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
got title from meta

Indicators

This is a term in the security industry to describe indicators such as IPs, Domains, Hashes, etc. This does not imply that any of these indicate malicious activity.

15.taboola.com
a.teads.tv
aax-eu.amazon-adsystem.com
acdn.adnxs.com
ad.yieldlab.net
ad4m.at
ad4mat.net
ads.pubmatic.com
adscale.nuggad.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
adx.adform.net
ajax.googleapis.com
ap-sync.nuggad.net
api.theadex.com
api.yieldlove-ad-serving.net
apis.google.com
as-sec.casalemedia.com
bbcdn-bbnaut.ibillboard.com
bttrack.com
c.amazon-adsystem.com
c.nativendo.de
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.emetriq.de
cdn.m6r.eu
cdn.speedcurve.com
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cds.taboola.com
cm.g.doubleclick.net
cmp.teads.mgr.consensu.org
confiant-integrations.global.ssl.fastly.net
crops.giga.de
cx.atdmt.com
d.agkn.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
eu-u.openx.net
eus.rubiconproject.com
fastlane.rubiconproject.com
files.giga-video.de
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
imprammp.taboola.com
irqs.ioam.de
js.adscale.de
js.agkn.com
js.stroeermediabrands.de
lb97.s400.meetrics.net
match.adsrvr.org
match.taboola.com
maxcdn.bootstrapcdn.com
media.oadts.com
native.adscale.de
orbidder.otto.de
pagead2.googlesyndication.com
pixel.rubiconproject.com
prg.smartadserver.com
px.powerlinks.com
rtb.mfadsrvr.com
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
sak.userreport.com
sb.scorecardresearch.com
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
ssl-econa.met.vgwort.de
ssl.1.damoh.giga.de
static.giga.de
sync.teads.tv
t.nativendo.de
t.teads.tv
tpc.googlesyndication.com
tracker-adserver.ibillboard.com
tracking.m6r.eu
trc.taboola.com
u.ipw.metadsp.co.uk
ups.xplosion.de
uss.xplosion.de
video-adserver.ibillboard.com
videos.giga.de
vidstat.taboola.com
www.dunkirkinception.com
www.facebook.com
www.giga.de
www.google-analytics.com
www.googletagservices.com
www.storygize.net
x.bidswitch.net
xpl.theadex.com
yieldlove-d.openx.net
as-sec.casalemedia.com
fastlane.rubiconproject.com
hbopenbid.pubmatic.com
orbidder.otto.de
prg.smartadserver.com
104.108.40.167
104.109.82.87
104.111.214.103
104.111.246.233
107.178.241.34
109.71.25.30
130.211.13.252
136.243.4.14
143.204.214.22
143.204.214.51
143.204.214.52
144.76.9.6
146.148.127.183
151.101.113.108
151.101.114.2
151.101.114.49
151.101.13.194
151.101.14.2
151.101.14.217
151.101.14.49
161.156.66.178
172.217.21.194
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
18.194.102.89
18.196.191.159
185.22.221.117
188.40.16.106
192.132.33.46
193.46.63.75
194.213.222.29
2.16.122.151
2.18.232.7
2.18.233.180
2.18.233.67
2.18.234.72
2001:4de0:ac19::1:b:2a
216.58.210.2
2600:9000:214f:1e00:1c:8c89:a300:93a1
2600:9000:214f:6600:12:6213:9cc0:93a1
2600:9000:214f:d800:15:efbc:e300:93a1
2606:4700:20::6819:ad0d
2a00:1450:4001:806::2001
2a00:1450:4001:80b::200a
2a00:1450:4001:815::200a
2a00:1450:4001:815::200e
2a00:1450:4001:819::2002
2a00:1450:4001:81a::2002
2a00:1450:4001:81a::200e
2a00:1450:4001:821::2002
2a02:26f0:6c00:194::5f76
2a02:26f0:6c00:292::2c92
2a03:2880:f02d:5:face:b00c:0:8c
2a03:2880:f12d:83:face:b00c:0:25de
34.248.95.73
34.250.43.132
34.95.120.147
35.156.148.74
35.156.29.62
35.186.238.175
35.190.94.1
35.244.211.12
37.157.4.24
37.252.173.27
40.113.136.100
46.253.113.178
52.219.73.195
52.222.151.91
52.28.148.3
52.94.220.16
54.154.79.134
54.246.164.155
54.70.1.117
62.168.44.125
69.173.144.136
80.82.201.88
89.163.159.110
89.163.159.117
89.163.159.124
91.215.100.39
91.215.100.40
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867
015c60de008c2c09f653fd7b36ba0bf4170e49bc983293ebae6c73521e043ce1
01c77e3fc7314ff132fd406b05d1d4fc9159c4c05ca1749a214a09fc50a5f0e3
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
0bc28bb79161e691cf1f11d550bc064b3b344c9f003c7ed11dcb3d66eb7f5e29
0c28220b73b11e2033c33c9d1191f6052642f80407aa364a01e378b8c5821cb6
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0eac1ff22bb875d24a2bf43334a1eb91f5a003513545c0aac8f476fb0d66f6b9
0f3c04be1a451827fba137c8600bd690656c3e62bd9f1b7d287bf548fd327fcd
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
1b35bd23206a199b500fdb41aa9dd3ddedb9cbfdd2f1b1da79c5a3f916e737e5
2100579855f03986263221fd7500ec5a1f247528c18718598d2a57cbf5ae6494
22ce005a22e7722f09a4306b188728d7997a14d4c3e07b67d55c993c41e7a961
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b
2a5b4cc141c383bb48c75951f13c333ba48bf1391b699e666a92ef4f1be1c83d
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
2e612006c729145084864324fe4b4e7b77aeab15de9c6629feeaa8670c77fb6e
2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
321ae50d051cba1ca63facbcb5417aff8ab28ebbb9e1c9597d146634df59f430
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
34647766dde6b04e1840a8d04b37b34fd0887848b2648137d03ea0554bae4747
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
37d39806e6c97d65ef8faf4fc91d08cff2bc5009bf45f73f6040df50f25e48cf
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
40c4598498d723f4f7406649ed88cba3ae85afbbb863e97b2723174e22b2381a
4330193cc2f6442925c50f1f9c9bf19ed4fe8a23012bbbdfe0e5626453809eeb
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630
4793266fb23f100b86f57ba198771815ce48ec3b6c3c2de6bde42e9f030787d2
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4b2adcdb881b1bbc657680ff97adfb6d13afa2d73f05376ba09104c43e33e8bb
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
504669a45bd5068ea7b4a1137b22cdacff6dd20ad5da8e571206e9ea961ed9ed
50f8753ce2cb3e604ec1bde4aaa9d0c4d0d8096cc313cbd76a7dbe9381c066c0
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
59345f09f23610da29c99d8fcd956666db82be2baf53965023add35dfabd975b
5aeb54f6727af87431148b611f64c2d9608b22f49b71cd313f5e023b0f6ee642
5d62a434970b61305d78c48011b07ec536712100117e9b36b7c32c2be9888bf6
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
60344566cd7a660f64f04524830eed95e6e8306dd1bc974d1bf3367acc081d6a
631bc9fa39ddcdd4008398e649671ba79db3cc7c1725d7b8cd9823ec243f0a48
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
63f4f82cf06f230550429133b1cdc57ece980f534134bc947aabbdedb58fb612
68054f40ce80021898dbb852bef549b5e4a8bd833ea36186a569d529e9bb4de3
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6c30c8bf65ef340337fa091233d65a79fb7a1021663ac0b2793789064425c4ad
6c5a863192d8b1a82f9a0fb550c45f778d42b8af36fc921045a055389062edad
6c7ed2d548e889f2bd271cc326596ba4ad529474c3881bf3fcbc39d8d3213706
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e
6d8ba81d1b60a18707722a1f2b62dad48a6acced95a1933f49a68b5016620b93
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
76c393f564f53c19e795307e622edc8657a603f7a816c2646385697286d11313
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
815599504eb91ce479c1cc73c16f8135d37181ab42a757fd6801fc114cd7d0ec
8169f1c80996bcbacc8733474b782be494a43f9fcc6e049554bd1e88818f81d6
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
83a20b049ccd6bf59807f68f989a45ea911697172a546839b7d5a0b5c2320206
85838fca0e7ee704142710df49c3ce62ed2d4dc4b52c3b644ca816608ea08099
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8d7d8d0629dc8b94a541f38658e5e6555a42d4162a17a29e283df2044c37e101
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
93f4275ac47482a7af300336dc775f356eb0b2b45f751dd5403bba137bad61bf
953de0ac288a5b55a2f1dadd6ba86b02592742ec2a178b8aa852b6b6afbe1f4c
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
992f08d6815756429915fd99c7ba4a6a0c74999fa6923eed08a89da60f26aeb1
994c75c7c155810e924895ddf706066b1dc59153d7e1697990ba915768c2d669
99ddca22fc298fbc23f9048c7b3b8d87edd49aaa20e3b32ab169f2e859838e5a
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
9f6b492f26b70363433c27e9e286ee717f90ee9b53b127c504416e9544dc3519
a0611e486e87faf678d732cede5f2b94c26550f87a9e8baf6393ac3e8f96268b
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a076460215972ba3aff72729a43dc7989ef8a85dba721e287bc9ccefeae3aa0f
a238e48b9d384a69c48822e5c6579cb05b63b69665a2203612af92043d4e9f87
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
a7792edb768c278732eafdfea1e48c35214ddcf3362046bef8927bc6ad1de0cf
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
ab14dda727a817a3af499421678261abfee56b136a6ff723917bd2c5b1b8de76
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
af2768521c0dea23cc763c9bd033e5839051bbf1557d001555553e4515a90b9d
aff49914c3f16bd7565f729e7d12de15706342599b511dada7736bbf3df8ca29
b15975ae95b0cbf15adf1ff8e77790fc0b4cb1f5f9b938f3c79abe2dda73e43d
b3b9136f33841bffb0363cd09f4e2b4527da358f771d359d066db6860ae7f727
b5db109474e1066ef7c6f59629678aa48eea57d3dbac37fc2392da925ef82231
b8aac981ff52fa651bcd9fb2d2375a4d4c7cb6b647ed263b4afdfb93a158e4e6
ba853d478c19a251d1c53a5737f23e445fdb82deada85657cd070d88fb3bbc13
bbfab60e485c027378bb9847f63629235fa4d4120c225ce3fa1451fda4ed3843
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8
bdd5b73f30871bd02b98a5756eb08f51a88e8d31094fac1b34a2ddd1abeb6dcb
bf62973c91c17fa21fb5281e96d9f7bbccd8c3133bf493b6a27e231044b385b3
bfdb4abddd21ddc48ff54af78b972d5169c900f1e6f2ebe78cd2c7dde190a1e1
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d23b76d0502f01f486b0025cdb942713385d66f4775fc86af7166da3c26313c1
d7625641666eb0d30c70ca6fa1cac3b0705486578733a364c9eff073045ae084
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d83403588cc6bf8c728659869f5c037d9fd3f51f5db5c7b44adbe2c818e15a55
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
db1b7df84644392f2ec2e4d7499c2ca1d7f4cde9f6fba0c7a778a97e18b3e805
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
e2a97466941bed9a135366275574721a53858ad664eb5a3cc421b1bd75ac687e
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
eb37ebd04d1be5ff16adcf9c5df0277fd7238655eeeedfdf7f265b98697e36b2
ebfe038cec11237af72424d60db98deef4aae52fb9e8584ac985d52d84a133f7
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
eedbd451b568034845c1ed016b076207ba44e546a71a4b231f3b4dcd32edcd7c
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f2cb1fffde0db39f5891b0526ef7d06559baab2b122ee451627d1c8c1c9d6ace
f4ffa7a21c597e7e3cf7c6153357a50abf76c7ee4df2ff5c67316b9d2c559fb7
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f6c88d72ddbc86769c79cd60c2fbffac3679934dca3c2173dc8f919bcbbbfd64
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
fba1138742fc760a1fe93792509bf9cf11763ecfd194219e9d35896a480757c0
fc093a072783c7d78fae4f82fb188d11c19f3366ce94803a02e7de6b9f421451