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 November 10 via api from US

Summary

This website contacted 81 IPs in 9 countries across 62 domains to perform 206 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
16 178.19.72.10 29551 (HGCOMP-ASN)
1 46.253.113.178 29551 (HGCOMP-ASN)
1 151.101.114.217 54113 (FASTLY)
1 91.215.100.39 43407 (INFONLINE-AS)
3 188.40.16.106 24940 (HETZNER-AS)
4 178.19.70.100 29551 (HGCOMP-ASN)
6 2a00:1450:400... 15169 (GOOGLE)
1 2 161.156.66.178 36351 (SOFTLAYER)
2 2a03:2880:f11... 32934 (FACEBOOK)
13 2a00:1450:400... 15169 (GOOGLE)
3 143.204.90.242 16509 (AMAZON-02)
1 193.46.63.75 43407 (INFONLINE-AS)
1 2 91.215.100.40 43407 (INFONLINE-AS)
6 109.71.25.30 29551 (HGCOMP-ASN)
6 107.178.241.34 15169 (GOOGLE)
3 178.19.72.20 29551 (HGCOMP-ASN)
3 7 104.109.82.87 20940 (AKAMAI-ASN1)
1 11 172.217.23.98 15169 (GOOGLE)
1 13.224.196.46 16509 (AMAZON-02)
3 2.18.233.67 16625 (AKAMAI-AS)
1 1 2600:9000:215... 16509 (AMAZON-02)
1 2600:9000:21f... 16509 (AMAZON-02)
1 18.195.39.206 16509 (AMAZON-02)
1 2600:9000:215... 16509 (AMAZON-02)
3 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
3 2606:4700:20:... 13335 (CLOUDFLAR...)
1 178.19.65.130 29551 (HGCOMP-ASN)
4 2a00:1450:400... 15169 (GOOGLE)
4 19 151.101.14.2 54113 (FASTLY)
1 2a00:1450:400... 15169 (GOOGLE)
3 52.29.12.192 16509 (AMAZON-02)
2 34.95.120.147 15169 (GOOGLE)
3 185.86.139.58 201081 (SMARTADSE...)
1 185.64.189.112 62713 (AS-PUBMATIC)
1 2.18.234.21 16625 (AKAMAI-AS)
6 136.243.4.15 24940 (HETZNER-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 3 2.19.43.224 20940 (AKAMAI-ASN1)
1 2a00:1450:400... 15169 (GOOGLE)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
6 2.18.234.72 16625 (AKAMAI-AS)
1 52.28.238.200 16509 (AMAZON-02)
2 151.101.113.194 54113 (FASTLY)
1 2 52.94.216.48 16509 (AMAZON-02)
2 52.219.72.195 16509 (AMAZON-02)
3 13.224.196.125 16509 (AMAZON-02)
1 184.30.220.71 20940 (AKAMAI-ASN1)
1 2.16.122.151 20940 (AKAMAI-ASN1)
2 2 18.185.154.43 16509 (AMAZON-02)
1 69.173.144.165 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
1 1 185.29.133.208 30419 (MEDIAMATH...)
4 151.101.114.49 54113 (FASTLY)
1 1 151.101.12.166 54113 (FASTLY)
2 185.33.223.83 29990 (ASN-APPNEXUS)
1 1 172.217.22.98 15169 (GOOGLE)
2 2 52.48.102.50 16509 (AMAZON-02)
1 1 100.20.21.65 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 130.211.13.252 15169 (GOOGLE)
2 3 52.58.36.240 16509 (AMAZON-02)
2 2 34.98.67.61 15169 (GOOGLE)
1 1 52.28.175.104 16509 (AMAZON-02)
1 188.40.45.203 24940 (HETZNER-AS)
5 78.46.46.82 24940 (HETZNER-AS)
1 213.202.235.9 24961 (MYLOC-AS)
1 185.59.220.19 60068 (CDN77)
1 2 199.166.0.24 7415 (ADSAFE-1)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
2 199.166.0.32 7415 (ADSAFE-1)
5 104.244.36.20 7415 (ADSAFE-1)
1 37.157.6.245 198622 (ADFORM)
1 52.214.103.10 16509 (AMAZON-02)
1 89.163.159.109 24961 (MYLOC-AS)
1 62.168.44.118 5588 (GTSCE GTS...)
4 54.77.22.22 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 62.138.221.190 61157 (PLUSSERVE...)
1 34.95.76.218 15169 (GOOGLE)
1 89.163.159.121 24961 (MYLOC-AS)
1 2600:9000:21f... 16509 (AMAZON-02)
1 143.204.101.24 16509 (AMAZON-02)
1 63.34.92.224 16509 (AMAZON-02)
1 1 89.163.159.108 24961 (MYLOC-AS)
1 34.248.95.73 16509 (AMAZON-02)
1 52.29.86.7 16509 (AMAZON-02)
2 54.171.34.13 16509 (AMAZON-02)
2 46.4.116.20 24940 (HETZNER-AS)
1 148.251.51.163 24940 (HETZNER-AS)
1 2.18.233.180 16625 (AKAMAI-AS)
206 81
Apex Domain
Subdomains
Transfer
28 giga.de
www.giga.de
static.giga.de
videos.giga.de
ssl.3.damoh.giga.de
ssl.1.damoh.giga.de
490 KB
24 taboola.com
cdn.taboola.com
trc.taboola.com
match.taboola.com
cds.taboola.com
161 KB
16 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
ff.doubleclick.net
cm.g.doubleclick.net
113 KB
13 google-analytics.com
www.google-analytics.com
40 KB
9 adsafeprotected.com
fw.adsafeprotected.com
static.adsafeprotected.com
dt.adsafeprotected.com
89 KB
9 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
55 KB
8 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
5 KB
6 de.com
s79.research.de.com
b63.s79.research.de.com
2 KB
6 adscale.de
ih.adscale.de
native.adscale.de
js.adscale.de
12 KB
6 meetrics.net
lb95.s400.meetrics.net
2 KB
5 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
34 KB
5 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
121 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 pubstack.io
boot.pubstack.io
cdn.prod.pubstack.io
intake.prod.pubstack.io
20 KB
4 yieldlove-ad-serving.net
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
969 B
4 googletagservices.com
www.googletagservices.com
115 KB
4 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
13 KB
4 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
89 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 mookie1.com
odr.mookie1.com
de-gmtdmp.mookie1.com
1 KB
3 bidswitch.net
x.bidswitch.net
1 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
59 KB
3 scorecardresearch.com
sb.scorecardresearch.com
2 KB
3 smartadserver.com
prg.smartadserver.com
4 KB
3 agkn.com
js.agkn.com
d.agkn.com
aa.agkn.com
4 KB
3 mxcdn.net
s400.mxcdn.net
s79.mxcdn.net
140 KB
3 giga-abs.de
go.giga-abs.de
2 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 exactag.com
m.exactag.com
cdn.exactag.com
2 KB
2 adsrvr.org
match.adsrvr.org
897 B
2 adnxs.com
ib.adnxs.com
1 KB
2 mfadsrvr.com
rtb.mfadsrvr.com
1 KB
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
24 KB
2 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
114 B
2 openx.net
yieldlove-d.openx.net
eu-u.openx.net
5 KB
2 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
122 KB
2 userreport.com
nugmw.userreport.com
sak.userreport.com
22 KB
2 facebook.com
www.facebook.com
575 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 consentric.de
pixel.consentric.de
354 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 adform.net
track.adform.net
467 B
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
344 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
449 B
1 contextweb.com
bh.contextweb.com
690 B
1 mathtag.com
sync.mathtag.com
473 B
1 powerlinks.com
px.powerlinks.com
402 B
1 rubiconproject.com
pixel.rubiconproject.com
239 B
1 yieldlab.net
ad.yieldlab.net
495 B
1 giga-video.de
files.giga-video.de
30 KB
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 casalemedia.com
as-sec.casalemedia.com
901 B
1 dkuim.de
dkuim.de
151 KB
1 google.com
adservice.google.com
172 B
1 google.de
adservice.google.de
172 B
1 dunkirkinception.com
www.dunkirkinception.com
455 B
1 nuggad.net
si.nuggad.net
598 B
1 yieldlove.com
cdn-a.yieldlove.com
92 KB
1 speedcurve.com
cdn.speedcurve.com
7 KB
206 62
Domain Requested by
16 www.giga.de www.giga.de
13 trc.taboola.com 4 redirects cdn.taboola.com
www.giga.de
13 www.google-analytics.com www.giga.de
www.google-analytics.com
11 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.giga.de
7 tracking.m6r.eu 3 redirects www.giga.de
cdn.m6r.eu
6 lb95.s400.meetrics.net www.giga.de
6 cdn.taboola.com www.giga.de
cdn.taboola.com
s79.mxcdn.net
6 videos.giga.de www.giga.de
videos.giga.de
text
5 dt.adsafeprotected.com www.giga.de
5 b63.s79.research.de.com www.giga.de
4 match.taboola.com www.giga.de
4 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
4 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
3 t.nativendo.de c.nativendo.de
3 x.bidswitch.net 2 redirects www.giga.de
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 ih.adscale.de www.giga.de
js.adscale.de
3 sb.scorecardresearch.com 1 redirects cdn.taboola.com
www.giga.de
3 prg.smartadserver.com cdn-a.yieldlove.com
3 prod-ingestion.tracking.v2.yieldlove-ad-serving.net cdn-a.yieldlove.com
3 c.nativendo.de d.nativendo.de
c.nativendo.de
www.giga.de
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 go.giga-abs.de www.giga.de
3 d.nativendo.de www.giga.de
c.nativendo.de
3 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
3 static.giga.de www.giga.de
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 ssl.3.damoh.giga.de text
2 intake.prod.pubstack.io www.giga.de
2 uss.xplosion.de www.giga.de
2 ups.xplosion.de js.stroeermediabrands.de
cdn.emetriq.de
2 static.adsafeprotected.com www.giga.de
2 fw.adsafeprotected.com 1 redirects securepubads.g.doubleclick.net
2 js.adscale.de c.nativendo.de
js.stroeermediabrands.de
2 s79.mxcdn.net securepubads.g.doubleclick.net
s79.mxcdn.net
2 odr.mookie1.com 2 redirects
2 match.adsrvr.org 2 redirects
2 ib.adnxs.com www.giga.de
2 rtb.mfadsrvr.com 2 redirects
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 de.ioam.de 1 redirects www.giga.de
2 www.facebook.com www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
1 ads.pubmatic.com cdn-a.yieldlove.com
1 eu-u.openx.net cdn-a.yieldlove.com
1 ssl.1.damoh.giga.de text
1 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
1 adstax-match.adrtx.net cdn.adrtx.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.giga.de
1 sak.userreport.com nugmw.userreport.com
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 cdn.prod.pubstack.io boot.pubstack.io
1 pixel.consentric.de
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com js.stroeermediabrands.de
1 dmp.theadex.com js.stroeermediabrands.de
1 boot.pubstack.io js.stroeermediabrands.de
1 track.adform.net js.stroeermediabrands.de
1 cdn.stroeerdigitalmedia.de www.giga.de
1 cdn.exactag.com www.giga.de
1 m.exactag.com www.giga.de
1 s79.research.de.com s79.mxcdn.net
1 aa.agkn.com 1 redirects
1 cds.taboola.com www.giga.de
1 bttrack.com www.giga.de
1 www.storygize.net 1 redirects
1 cm.g.doubleclick.net 1 redirects
1 bh.contextweb.com 1 redirects
1 sync.mathtag.com 1 redirects
1 px.powerlinks.com 1 redirects
1 pixel.rubiconproject.com www.giga.de
1 ad.yieldlab.net www.giga.de
1 native.adscale.de c.nativendo.de
1 files.giga-video.de www.googletagservices.com
1 d.agkn.com js.agkn.com
1 cdn.m6r.eu js.stroeermediabrands.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 tpc.googlesyndication.com securepubads.g.doubleclick.net
1 ajax.googleapis.com www.giga.de
1 as-sec.casalemedia.com cdn-a.yieldlove.com
1 hbopenbid.pubmatic.com cdn-a.yieldlove.com
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 ff.doubleclick.net securepubads.g.doubleclick.net
1 dkuim.de www.giga.de
1 imasdk.googleapis.com videos.giga.de
1 adservice.google.com pagead2.googlesyndication.com
1 adservice.google.de pagead2.googlesyndication.com
1 js.agkn.com js.stroeermediabrands.de
1 www.dunkirkinception.com www.giga.de
1 nugmw.userreport.com www.giga.de
1 si.nuggad.net 1 redirects
1 s400.mxcdn.net js.stroeermediabrands.de
1 cdn-a.yieldlove.com js.stroeermediabrands.de
1 irqs.ioam.de script.ioam.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
1 js.stroeermediabrands.de www.giga.de
206 101
Subject Issuer Validity Valid
*.giga.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-02
2 years crt.sh
*.stroeermediabrands.de
RapidSSL RSA CA 2018
2018-09-06 -
2020-12-05
2 years crt.sh
a3.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-11-04 -
2020-09-10
10 months crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-10-16 -
2020-01-08
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-09-22 -
2019-12-20
3 months crt.sh
*.google-analytics.com
GTS CA 1O1
2019-10-16 -
2020-01-08
3 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
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
2019-10-02 -
2020-11-02
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2019-11-04 -
2021-02-02
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
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-10-16 -
2020-01-08
3 months crt.sh
*.googleapis.com
GTS CA 1O1
2019-10-16 -
2020-01-08
3 months crt.sh
ssl379338.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-10-14 -
2020-04-21
6 months crt.sh
*.dkuim.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-03
2 years crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-07-30 -
2020-07-25
a year crt.sh
*.doubleclick.net
GTS CA 1O1
2019-10-16 -
2020-01-08
3 months crt.sh
*.tracking.v2.yieldlove-ad-serving.net
Amazon
2019-04-02 -
2020-05-02
a year crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
*.smartadserver.com
Thawte RSA CA 2018
2018-09-07 -
2020-02-17
a year crt.sh
*.pubmatic.com
Sectigo RSA Organization Validation Secure Server CA
2019-02-22 -
2021-02-21
2 years crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2019-07-17 -
2020-03-09
8 months crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.scorecardresearch.com
COMODO RSA Organization Validation Secure Server CA
2018-11-28 -
2019-12-26
a year crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-10-16 -
2020-01-08
3 months crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-01-01
a year crt.sh
aax-eu.amazon-adsystem.com
Amazon
2019-09-18 -
2020-08-26
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
*.adscale.de
DigiCert SHA2 Secure Server CA
2019-02-19 -
2020-05-20
a year crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
g2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-03 -
2019-11-19
7 months crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
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
*.bidswitch.net
Sectigo RSA Domain Validation Secure Server CA
2019-04-17 -
2020-05-04
a year crt.sh
*.exactag.com
COMODO RSA Organization Validation Secure Server CA
2017-11-16 -
2020-02-14
2 years crt.sh
*.adsafeprotected.com
COMODO RSA Domain Validation Secure Server CA
2018-08-20 -
2020-09-17
2 years crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
*.prod.pubstack.io
Amazon
2019-09-18 -
2020-10-18
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2019-10-11 -
2021-10-10
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
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
pixel.consentric.de
GlobalSign Organization Validation CA - SHA256 - G2
2019-05-02 -
2020-05-02
a year crt.sh
cdn.prod.pubstack.io
Let's Encrypt Authority X3
2019-09-19 -
2019-12-18
3 months 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
yieldlove-ad-serving.net
Amazon
2019-10-23 -
2020-11-23
a year crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2019-10-16 -
2020-01-14
3 months crt.sh

This page contains 21 frames:

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

Frame: https://videos.giga.de/embed/176875
Frame ID: 2A06D782BFC727C6F07D0103C50C91F7
Requests: 18 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: FF670A6D1273A536DD26400AA3174120
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20191106/r20190131/zrt_lookup.html
Frame ID: B1DA58F7103851EFF9D7265F8B1353D3
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=1459277723&w=468&lmt=1573371874&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=1573371874130&bpp=8&bdt=152&fdt=60&idt=60&shv=r20191106&cbv=r20190131&saldr=aa&abxe=1&correlator=3093041849579&frm=20&pv=2&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&ga_fc=0&iag=0&icsg=2251851588218866&dssz=55&mdo=0&mso=0&u_tz=60&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=20040031&oid=3&pvsid=107113790445042&rx=0&eae=0&fc=896&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=rQbMRbySiw&p=https%3A//www.giga.de&dtd=72
Frame ID: 2DB2939E79EFDA5BEF7F16B3CF1A2D6A
Requests: 1 HTTP requests in this frame

Frame: https://ff.doubleclick.net/tag/js/fetch_frame_2019103101.html
Frame ID: ECC95DC0CDAB6E2BF888FF286F2B9ED4
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=1573371874&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=1573371874138&bpp=3&bdt=160&fdt=192&idt=192&shv=r20191106&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=3093041849579&frm=20&pv=1&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&ga_fc=0&iag=0&icsg=828392537890&dssz=59&mdo=0&mso=0&u_tz=60&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=20040031&oid=3&pvsid=107113790445042&rx=0&eae=2&fc=896&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=197
Frame ID: 2CDBC26CB9575652D7D18682CE006CEB
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=289353145&gdpr=1&gdpr_consent=&ref=&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: BE0A04B0AAD941A21710DDF02FB2C951
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: A16CF95A4CA792C8FA9CD68CA2759EF6
Requests: 1 HTTP requests in this frame

Frame: https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=d83fb889-d96d-417d-9470-362dd1e8bf60
Frame ID: D5EDB61BA7AA0E8BA7C04C4567A36D59
Requests: 13 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvwIr4bGmvodKqxhJvky8hb22TiuM-D4ZYw66DJ-DaE6tHyPPqS4B0KsX8dEcsL7lIHDCgWiqjAIYCrNP-MnPCfzZjLEv19_m8tE9MzgeiSJCZcr8r93ut6RHDcPmlugit1SuTKuk-uuC4X85wCPoDffZcv2saZ22F34G1eng8DDc9julUKYwCb9JP8tnwSj9wgecYbsref_MdDvZOawBTlcVPmvydtrr0mD38uN-LfE4UCdGiwtzlrZGxm8H-0FPWJU6z2NpM9Nbpvg5DAJonE1vvyNlQD6cyBKPrUHN_S&sig=Cg0ArKJSzEIITM94nvxWEAE&urlfix=1&adurl=
Frame ID: 6B178D39DE87F18DEF448381D89A43AD
Requests: 4 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvk3La_j6yhPayTODHZXORAAXsXb4yKbQcJjiDIN_HL2bTLYE3Jo6f9e9EV1HUrjS-ZEhBeq_QSxOpeUpzxUl-FvR7Me3Q0jxoAOXmVC16WvDh6Ev_S_i1C3nf81db12lf5Z8uQwIJ8fFPdJDpNSkMPZTYCcS3ReNo1n01Naac7Ji93ctD-3Ino9tM9DqSCoyj7nHWEBAjAbOKLw2n42gkj2Oc6FBhFP7n85hpyRu_Lq5eCtIqaIJBFw_Wvb1NTKT2PZT3cngX9ji2zzIYrOuSgWl_TgDA7CLz9ju0-yhrR&sig=Cg0ArKJSzJsFHExFylX0EAE&urlfix=1&adurl=
Frame ID: 1A9285A439118990878838963D052903
Requests: 2 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssHeN_3NkmHSdKQBS-drZb8y_9R7LzbuljG3pGdXq58DJKcsX6Tk0AOeuel88bST3eN64lfIVfD0cF1Dk_jE7yys1x2qH0-B1P96Z-HO0OJVBNUjeDsENLTILDot_c-fLp-pzzPAMt_0xRju11BwDYHGw49dco_JRYTWXguaIA4lvSWNP77Ur0CN8wHnjDH5wuKe_8boDIKzNgj1CwoxvCZvS0_wnAbQ-U2CTW5iri_HozHvkh1y4NC0vTs2ohcNHD6NJASvxt6UApvpw9MaiR-CrTHTRD2d3egJbnEJ6Rimgf1OiPDcug1pD4&sig=Cg0ArKJSzPBZzraxNkXxEAE&urlfix=1&adurl=
Frame ID: 09106916C492EC8D5F2B6E35D95C8D98
Requests: 6 HTTP requests in this frame

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

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

Frame: https://static.adsafeprotected.com/sca.17.4.95.js
Frame ID: 73B3BF2BA97BBD53B8241293D1D63486
Requests: 1 HTTP requests in this frame

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

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

Frame: data://truncated
Frame ID: C8B61D4DA8E2E81B62A61DEB6F0FAA38
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: 2238EB51375B7F7802585129653D921F
Requests: 1 HTTP requests in this frame

Frame: https://ads.pubmatic.com/AdServer/js/showad.js
Frame ID: A577A0C97E0530A545D89DB055B8FAF6
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

206
Requests

100 %
HTTPS

18 %
IPv6

62
Domains

101
Subdomains

81
IPs

9
Countries

2064 kB
Transfer

6158 kB
Size

31
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 14
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1 HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 20
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=001285e55987b23775dc7bfe2&ep=1600044813&vr=415&id=wapd74&i3=001285e55987b23775dc7bfe2%3A1600242274021%3A1573371874021%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1573371874021&n1=3&dntt=0&lt=1573371874023&ev=&cs=7b0vv7&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=001285e55987b23775dc7bfe2&ep=1600044813&vr=415&id=wapd74&i3=001285e55987b23775dc7bfe2%3A1600242274021%3A1573371874021%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1573371874021&n1=3&dntt=0&lt=1573371874023&ev=&cs=7b0vv7&mo=1&sr=71
Request Chain 27
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Request Chain 31
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 32
  • 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 HTTP 302
  • https://nugmw.userreport.com/rc-ap/fdf60e3c-e1b8-428d-828b-8af24a3b50f1/si.nuggad.net/nuggad?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
Request Chain 96
  • 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 102
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1573371874603&ns_c=UTF-8&cv=3.1&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= HTTP 302
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573371874603&ns_c=UTF-8&cv=3.1&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=
Request Chain 108
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=d15aed7237d248b60bed57f124711de3
Request Chain 113
  • 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=d83fb889-d96d-417d-9470-362dd1e8bf60
Request Chain 115
  • 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=QF8nanX9N_td2YMf25pT3mGEeHVBTdngNee6Uf2zSVI%3D
Request Chain 116
  • https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID] HTTP 302
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=76a45dc7-b622-4f00-8757-0a5bf245e439 HTTP 302
  • https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=76a45dc7-b622-4f00-8757-0a5bf245e439&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D76a45dc7-b622-4f00-8757-0a5bf245e439
Request Chain 117
  • https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%% HTTP 302
  • https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=PN5YqMWiXMVy&ev=1&pid=562107
Request Chain 119
  • 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=CAESEF9VwtyjN7j89UH4vWrkL1s&google_cver=1 HTTP 302
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEF9VwtyjN7j89UH4vWrkL1s&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3DCAESEF9VwtyjN7j89UH4vWrkL1s%26google_cver%3D1
Request Chain 121
  • 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=05c7807c-99ff-474e-9424-f93057e95431 HTTP 302
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=05c7807c-99ff-474e-9424-f93057e95431&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D05c7807c-99ff-474e-9424-f93057e95431
Request Chain 122
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562 HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=77423821-afe9-440c-9acf-25eefbef82bd HTTP 302
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=77423821-afe9-440c-9acf-25eefbef82bd&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D77423821-afe9-440c-9acf-25eefbef82bd
Request Chain 125
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola HTTP 302
  • https://odr.mookie1.com/t/v2/sync?tagid=V2_790378&src.visitorId=8372a621-8284-41b1-b96a-1233bf4d2702 HTTP 302
  • https://aa.agkn.com/adscores/g.pixel?sid=9212302828&puid=10814409342764586437 HTTP 302
  • https://odr.mookie1.com/t/v2?tagid=V2_785409&src.visitorId=266700603235000368849 HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=419&user_id=10814409342764586437
Request Chain 152
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvBWsVqj0CYgS_6RgxlNhfOvyvUQmGQ1SiA1Si64DlcSDOytNfOxfjwQDxaoMoXBNuw-2_jFxcmL8flhqtEZTQ79zGLxzymF7qrqz7EnUHFxWy99hCCW5dYlmNUNTJxRzvkIoOgP2K20yOH3kKffQ1CWxj7svXyMnfcJo76r3mH4myX-3gvz15ts12O5grjdBbO-Y3cDMTnJ02smfM92mU4tgf96mYHFFrl8dkHgAAzs_wvzXUIXSEvOK2B5lTGRDRkstbatHuCUFmbWbGWKQ&sig=Cg0ArKJSzCiVMnZWjhMpEAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 157
  • https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754020/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&adsafe_type=abdfq&adsafe_jsinfo=,id:df95007b-20b7-f7eb-5b61-3032a9ef8474,c:tyizP3,sl:inView,em:true,fr:true,mn:app54ami,pt:1-5-15,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,br:u,abv:na,an:n,scm:forwrd1,fm:rHpa2Q8+11|12|1311|1312|1313|14|151|16|17|18|1911|1a|1b|1c|1d|1e*.346702-39754020|1f|1g,idMap:1e*,pl:,rend:0,renddet:WINDOW,rmeas:0,es:0,sc:1,ha:1,gm:0,tt:rjss,thd:1,et:18,oid:f0a83965-038d-11ea-9453-382c4ac630bd,v:19.8.25,sp:0,wr:1600.1200,sr:1600.1200,ov:0 HTTP 302
  • https://static.adsafeprotected.com/skeleton.js
Request Chain 186
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBsBFBSJFWSRAWsUkWsfABifABSfABSfABifABifABfrr&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=4209144157264917545

206 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/
113 KB
44 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
531a66d87c003af79326c86806b3645dca4f8b7d2a1eb73e07b57b55300357c7

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/78.0.3904.70 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/78.0.3904.70 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, 10 Nov 2019 07:44:33 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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:33 GMT
last-modified
Sat, 09 Nov 2019 11:31:37 GMT
server
nginx
accept-language
bytes
etag
"5dc6a399-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, 09 Nov 2020 07:44:33 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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:33 GMT
last-modified
Sat, 09 Nov 2019 11:31:37 GMT
server
nginx
accept-language
bytes
etag
"5dc6a399-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, 09 Nov 2020 07:44:33 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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:33 GMT
last-modified
Sat, 09 Nov 2019 11:31:37 GMT
server
nginx
accept-language
bytes
etag
"5dc6a399-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, 09 Nov 2020 07:44:33 GMT
metaTag.min.daa0a919cde011858b81e921cdd94d2f.js
js.stroeermediabrands.de/
249 KB
60 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.daa0a919cde011858b81e921cdd94d2f.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
f7e0a93c8b665fd0fd4632e1d87f61c0e441a6f477f1647332b78301ed9370b6

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
last-modified
Fri, 08 Nov 2019 12:01:54 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, 09 Nov 2020 07:44:34 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.114.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/78.0.3904.70 Safari/537.36

Response headers

strict-transport-security
max-age=15768000
content-encoding
gzip
age
45554
x-cache
HIT
status
200
content-length
6462
x-served-by
cache-hhn4055-HHN
access-control-allow-origin
*
last-modified
Sat, 09 Nov 2019 19:05:19 GMT
server
Apache
x-timer
S1573371874.005917,VS0,VE0
date
Sun, 10 Nov 2019 07:44:34 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
expires
Sun, 10 Nov 2019 19:05:19 GMT
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
x-cache-hits
6036
pre-5cb802ef9b.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-5cb802ef9b.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
beeb183690bc39bcaac010f4b4b8fec2c573c525522e73afc19bf3afcd35e015

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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 08 Nov 2019 10:22:26 GMT
content-encoding
gzip
x-original-content-length
60862
server
nginx
status
200
etag
W/"5dc54187-edbe"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
19391
expires
Sat, 07 Nov 2020 10:22:26 GMT
main-desktop-fb50956d54.css
www.giga.de/static-local/dist/assets/css/
399 KB
53 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-fb50956d54.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
1cb32f69d6c95c0a152ca35ffac4daeabda8f30ec6ed5ae2821dc29e4982184d

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/78.0.3904.70 Safari/537.36

Response headers

date
Fri, 08 Nov 2019 10:22:26 GMT
content-encoding
gzip
x-original-content-length
409035
server
nginx
status
200
etag
W/"5dc54185-63dcb"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
53801
expires
Sat, 07 Nov 2020 10:22:26 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 0012
Resource Hash
27985c092be25c3437bc2f6af2667ef7f041ce809fe0581d9d3aea8c3b01ea07

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
Content-Encoding
gzip
Last-Modified
Sun, 10 Nov 2019 07:44:34 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 0012
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, 10 Nov 2019 09:44:34 GMT
trackcp.js
gocp.stroeermediabrands.de/
28 KB
11 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
9cc497bc619324d17e01cd772c713cb796aeb0cd31a200a674dee1a96aab9d8d

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
Content-Encoding
gzip
Last-Modified
Thu, 07 Nov 2019 11:22:37 GMT
ETag
"5dc3fe7d-6fa7"
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, 11 Nov 2019 07:44:34 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/78.0.3904.70 Safari/537.36

Response headers

date
Sat, 19 Oct 2019 14:38:48 GMT
x-content-type-options
nosniff
age
1875946
filer-source
ca7b44b53d5a66e850355c11821198c504e518f8f12b295bd9c54d22bb538e08
x-cache
HIT
status
200
accept-language
bytes
content-length
796
x-xss-protection
1; mode=block
last-modified
Sat, 19 Oct 2019 14:38:48 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
Mon, 18 Nov 2019 14:38:48 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
104 KB
37 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:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
dce09f5e55feb176dedd208a98b683f1686217e55f0bf701465270347d24c634
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
37737
x-xss-protection
0
server
cafe
etag
4618039243053350689
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Sun, 10 Nov 2019 07:44:34 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/78.0.3904.70 Safari/537.36

Response headers

date
Tue, 05 Nov 2019 07:28:26 GMT
x-content-type-options
nosniff
age
432967
filer-source
3dc62a8e18f9b6ceb94ecf895297d72ce0545c5156c00f0fa8e434dc55d3102e
x-cache
HIT
status
200
accept-language
bytes
content-length
18921
x-xss-protection
1; mode=block
last-modified
Tue, 05 Nov 2019 07:28:26 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
Thu, 05 Dec 2019 07:28:26 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/78.0.3904.70 Safari/537.36

Response headers

date
Sat, 02 Nov 2019 07:58:54 GMT
x-content-type-options
nosniff
age
690339
filer-source
7154c03f1279d42875baf477c69c8abd717043148b5dba0c147151812277507b
x-cache
HIT
status
200
accept-language
bytes
content-length
21316
x-xss-protection
1; mode=block
last-modified
Sat, 02 Nov 2019 07:58:54 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
Mon, 02 Dec 2019 07:58:54 GMT
giga.svg
www.giga.de/static-local/dist/assets/images/logos/
11 KB
4 KB
Image
General
Full URL
https://www.giga.de/static-local/dist/assets/images/logos/giga.svg
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
dd28ac8237e60211a798ccc9ecacec2accc1fd02ee06f6264a3624606cd38831

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:33 GMT
content-encoding
gzip
last-modified
Sat, 09 Nov 2019 11:31:37 GMT
server
nginx
status
200
etag
W/"5dc6a399-2ad8"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
image/svg+xml
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
expires
Mon, 09 Nov 2020 07:44:33 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/78.0.3904.70 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Sun, 10 Nov 2019 07:44:34 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, 10 Nov 2019 07:44:33 GMT
Last-Modified
Sun, 10 Nov 2019 07:44:33 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
362 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:f11c:8183: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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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
alt-svc
h3-23=":443"; ma=3600
content-length
44
expires
Sun, 10 Nov 2019 07:44:34 GMT
tr
www.facebook.com/
44 B
213 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
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:f11c:8183: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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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
alt-svc
h3-23=":443"; ma=3600
content-length
44
expires
Sun, 10 Nov 2019 07:44:34 GMT
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-5cb802ef9b.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::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/78.0.3904.70 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
4257
date
Sun, 10 Nov 2019 06:33:37 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Sun, 10 Nov 2019 08:33:37 GMT
apstag.js
c.amazon-adsystem.com/aax2/
88 KB
26 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-5cb802ef9b.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.90.242 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-90-242.fra50.r.cloudfront.net
Software
Server /
Resource Hash
1d578dc3367ffc480f6c230a912f72e3906d4438b5daaf1c319fd3b7a006cd3d

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/78.0.3904.70 Safari/537.36

Response headers

date
Sat, 09 Nov 2019 19:42:20 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA50-C1
etag
4802c581ddff8a15b3e0b68c83bbce7b
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
accept-ranges
bytes
x-amz-cf-id
2Iz0qthnYd19hr_7OEeIRA41LbnqIHgRx97gKe_YDSpFxfxxs4NUnA==
via
1.1 ba77f90aac0ddbc2c4c2c02062fac762.cloudfront.net (CloudFront)
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.09570633703091591
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=001285e55987b23775dc7bfe2&ep=1600044813&vr=415&i...
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=001285e55987b23775dc7bfe2&ep=1600044813&vr=415&i...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=001285e55987b23775dc7bfe2&ep=1600044813&vr=415&id=wapd74&i3=001285e55987b23775dc7bfe2%3A1600242274021%3A1573371874021%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1573371874021&n1=3&dntt=0&lt=1573371874023&ev=&cs=7b0vv7&mo=1&sr=71
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 / BLACKBIRD-RCV v1.05.0 0025
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 0025
Transfer-Encoding
chunked
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
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 0025
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, 10 Nov 2019 07:44:34 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=001285e55987b23775dc7bfe2&ep=1600044813&vr=415&id=wapd74&i3=001285e55987b23775dc7bfe2%3A1600242274021%3A1573371874021%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1573371874021&n1=3&dntt=0&lt=1573371874023&ev=&cs=7b0vv7&mo=1&sr=71
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, 10 Nov 2018 07:44:34 GMT
lazyload-65c07b80e0.min.js
www.giga.de/static-local/dist/assets/js/vendor/lazyload/
5 KB
2 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/lazyload/lazyload-65c07b80e0.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-5cb802ef9b.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
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268

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/78.0.3904.70 Safari/537.36

Response headers

date
Wed, 29 May 2019 08:31:18 GMT
content-encoding
gzip
x-original-content-length
5207
server
nginx
status
200
etag
W/"5cee42b6-1457"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2015
expires
Thu, 28 May 2020 08:31:18 GMT
176875
videos.giga.de/embed/ Frame 2A06
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/176875
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
8e851426fdd64dbee15e3f999b9b528b45c1ada813496ec03c62f279aaf426c9

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/176875
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/78.0.3904.70 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
ioam2018=001285e55987b23775dc7bfe2:1600242274021:1573371874021:.giga.de:2:giga:software_content:noevent:1573371874021:akas42
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 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, 10 Nov 2019 07:44:34 GMT
content-type
text/html;charset=UTF-8
content-encoding
gzip
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
10 KB
10 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?53628368
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
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-fb50956d54.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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:33 GMT
last-modified
Sat, 09 Nov 2019 11:31:37 GMT
server
nginx
accept-language
bytes
etag
"5dc6a399-265c"
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
9820
expires
Mon, 09 Nov 2020 07:44:33 GMT
init
d.nativendo.de/cds/delivery/
991 B
920 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
b71ee50d2aefd4b9241ffd0a8a229552e4269cdb8ad05a4a097c8c72c3cdd05b

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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
last-modified
Sun, 10 Nov 2019 07:44:34 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
js
www.google-analytics.com/gtm/
58 KB
22 KB
Script
General
Full URL
https://www.google-analytics.com/gtm/js?id=GTM-KRW4T6J&t=gt1&cid=1630675580.1573371874&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:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
f6b9ce87b489624061f59fc26b2a1e7ef25238fac783c04df7c5e7e36cdbaf27
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
br
last-modified
Sun, 10 Nov 2019 06:00:00 GMT
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
21957
x-xss-protection
0
expires
Sun, 10 Nov 2019 07:44:34 GMT
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.2621080548492456
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
b6b69022dbeedf8b91a3a3ea6946be8114306c0042606cae67bea0ef28404f1f
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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
X-Content-Type-Options
nosniff
Last-Modified
Sun, 10 Nov 2019 07:44:34 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Mon, 11 Nov 2019 07:44:32 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame FF67
Redirect Chain
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software
  • 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.3, , 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/78.0.3904.70 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/78.0.3904.70 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, 10 Nov 2019 07:44:34 GMT
Content-Length
1579
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=d15aed7237d248b60bed57f124711de3; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Sat, 08 Feb 2020 07:44:34 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, 10 Nov 2019 07:44:34 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Sun, 10 Nov 2019 08:44:34 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
51 KB
16 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.daa0a919cde011858b81e921cdd94d2f.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
60e578406dfc9c739c3864f8b20b1235d6be2d3b3f41f50423ff06b839c25e11
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"332 / 970 of 1000 / last-modified: 1573250728"
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15603
x-xss-protection
0
expires
Sun, 10 Nov 2019 07:44:34 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
297 KB
92 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.daa0a919cde011858b81e921cdd94d2f.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.46 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-46.fra2.r.cloudfront.net
Software
/ Express
Resource Hash
7cbbb86e34178982a12c3c1caeb5c1c073748bfbe606151e7d7e69e41705bfb0

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 05:04:51 GMT
content-encoding
gzip
age
9570
status
200
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=10800
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
MIVgN51W8Uw23CFtZHEGXw8FwYqE19pMuPdVff0Cc3kiBpC70OAysA==
via
1.1 c28c128e9402fb070daca09bab68490a.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.daa0a919cde011858b81e921cdd94d2f.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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 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, 10 Nov 2019 09:44:34 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
598 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.3, , 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
4bb47fa38ca7745888b1b6001b319721e197974d981789d595c08325e451a1f7

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 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
107

Redirect headers

Date
Sun, 10 Nov 2019 07:44:34 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
nuggad
nugmw.userreport.com/rc-ap/fdf60e3c-e1b8-428d-828b-8af24a3b50f1/si.nuggad.net/
Redirect Chain
  • 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
  • https://nugmw.userreport.com/rc-ap/fdf60e3c-e1b8-428d-828b-8af24a3b50f1/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2...
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/fdf60e3c-e1b8-428d-828b-8af24a3b50f1/si.nuggad.net/nuggad?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: 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
2600:9000:21f3:5e00:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
1662d322e37cf13dc213b2ea4f5ec1ddb3052f91010b9fbe96283dcc4de46465

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 04ce5a607a98db6d08257633417b84d7.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C2
access-control-allow-methods
get, post, options
content-type
text/javascript
status
200
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
1851
x-amz-cf-id
F2bHfwWT503GAnZ12ep2I50rWnxIoOogxxqssH96s7qiZW8kSsJqhg==

Redirect headers

date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 d627b75d0c1aedd3691390ac8498d3b0.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA50-C1
status
302
access-control-allow-methods
get, post, options
location
https://nugmw.userreport.com/rc-ap/fdf60e3c-e1b8-428d-828b-8af24a3b50f1/si.nuggad.net/nuggad?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
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
0
x-amz-cf-id
3FEWs02TKKutagwXlI_AHtoAT3CM_NVCmUsbBaUFmW0gCImO-ay-kg==
ad-loading.gif
www.dunkirkinception.com/detect/
144 B
455 B
Image
General
Full URL
https://www.dunkirkinception.com/detect/ad-loading.gif?p=imagex/
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
18.195.39.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-195-39-206.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
6d73fde54289be2db5f96225f622a9729557351aa068fc8318071a0083583b77

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
X-Powered-By
TSAdServer
ETag
W/"90-/kQTZiEjNim1eV+q9ypuoggaFaM"
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
144
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.daa0a919cde011858b81e921cdd94d2f.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2156:c600:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

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/78.0.3904.70 Safari/537.36

Response headers

date
Sat, 09 Nov 2019 20:23:31 GMT
via
1.1 cdb2dba3874dd4d7b53213b8c63a0997.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
112670
etag
"f53f55cbab099be3a970b446a66c496a"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA50-C1
accept-ranges
bytes
content-length
3167
x-amz-cf-id
au1T2jnaaYlv_zkW6ubXRee1qR-Y4452dJNZoCc9s1jfo6ESsDpkRQ==
integrator.js
adservice.google.de/adsid/
109 B
172 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:825::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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 10 Nov 2019 07:44:34 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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
172 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:825::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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 10 Nov 2019 07:44:34 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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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_fy2019.js
pagead2.googlesyndication.com/pagead/js/r20191106/r20190131/
223 KB
84 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191106/r20190131/show_ads_impl_fy2019.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:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
765c79d7db932953b7c4c409e04a582a7b9f0cad3ebdfee6d5cf3dc5bbb8d1eb
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
85805
x-xss-protection
0
server
cafe
etag
13703052858572555981
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sun, 10 Nov 2019 07:44:34 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191106/r20190131/ Frame B1DA
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20191106/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:81d::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/r20191106/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/78.0.3904.70 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/78.0.3904.70 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
Thu, 07 Nov 2019 00:13:54 GMT
expires
Thu, 21 Nov 2019 00:13:54 GMT
content-type
text/html; charset=UTF-8
etag
17893446177683960593
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7725
x-xss-protection
0
cache-control
public, max-age=1209600
age
286240
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
post-c0b8abd8b0.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-c0b8abd8b0.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-5cb802ef9b.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
d4b7507a7cee314407aca61e663b9a995162d6ab7418407789755c591647341b

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/78.0.3904.70 Safari/537.36

Response headers

date
Tue, 05 Nov 2019 09:59:31 GMT
content-encoding
gzip
x-original-content-length
7051
server
nginx
status
200
etag
W/"5dc147a5-1b8b"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2681
expires
Wed, 04 Nov 2020 09:59:31 GMT
giga-772cc0e021.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-772cc0e021.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-5cb802ef9b.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
89b7e20cf73c5d61af4ae659c63f2eab235dd32a1dce673b5e6c3d47be59d6ef

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/78.0.3904.70 Safari/537.36

Response headers

date
Tue, 05 Nov 2019 09:59:31 GMT
content-encoding
gzip
x-original-content-length
31296
server
nginx
status
200
etag
W/"5dc147a5-7a40"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
11732
expires
Wed, 04 Nov 2020 09:59:31 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-5cb802ef9b.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/78.0.3904.70 Safari/537.36

Response headers

date
Wed, 11 Sep 2019 09:34:55 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:55 GMT
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
7 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
143.204.90.242 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-90-242.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

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/78.0.3904.70 Safari/537.36

Response headers

date
Sat, 09 Nov 2019 13:46:23 GMT
via
1.1 1d87c34bb2f20fda8e0841bc33179769.cloudfront.net (CloudFront)
vary
Origin
age
64692
x-cache
Hit from cloudfront
status
200
content-length
6482
last-modified
Fri, 01 Nov 2019 13:46:13 GMT
server
AmazonS3
etag
"a4d296427fc806b21335359e398c025c"
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
access-control-allow-origin
*
cache-control
public, max-age=86400
x-amz-cf-pop
FRA50-C1
accept-ranges
bytes
x-amz-cf-id
tJc4_up54Y9N2JzPzZQJzsrMFLziCs-44VhOGEiTvzHZBSO-eac5Hw==
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-5cb802ef9b.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/78.0.3904.70 Safari/537.36

Response headers

date
Wed, 27 Mar 2019 21:57:05 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 21:57:05 GMT
videojs-ff0ddd6c.min.js
videos.giga.de/dist/js/embed/bundle/ Frame 2A06
618 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875
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
56a110fa4752f768e35dbf197411e19faebf4c8eb59ee8545cc019dc61a1f0be

Request headers

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

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
last-modified
Thu, 24 Oct 2019 09:14:02 GMT
server
nginx/1.14.1
etag
W/"5db16b5a-9a933"
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 2A06
272 KB
92 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
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c5ce02d4faa9333de3e11f24c4cb2f335edb64ff6c0e9174365e8a34c550e75b
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
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
94526
x-xss-protection
0
expires
Sun, 10 Nov 2019 07:44:34 GMT
loader.js
c.nativendo.de/cdn/asset/js/
54 KB
17 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
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:ac0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
af9e05e18a2be5ae5a15505e259ae486da5030111e991c9d1bc5060fcd938221

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 google
cf-cache-status
HIT
age
1033468
cf-polished
origSize=55238
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
533666e5c883cb9c-VIE
expires
Wed, 28 Oct 2020 08:40:03 GMT
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=1573371874169&__it=-60&__ic=727391&__iq=c9043f73cb045f34fee88b602615d4fd&__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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 GMT
Last-Modified
Mon, 02 Nov 2009 07:42:56 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, 04 Nov 2012 07:42:56 GMT
collect
www.google-analytics.com/r/
35 B
105 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1479104569&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=565870627&gjid=1373266755&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&z=1576250953
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:34 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame 2A06
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
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
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
last-modified
Thu, 24 Oct 2019 09:14:02 GMT
server
nginx/1.14.1
etag
W/"5db16b5a-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 2A06
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
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
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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, 08 Feb 2020 07:44:34 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-5cb802ef9b.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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 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
ads
googleads.g.doubleclick.net/pagead/ Frame 2DB2
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=1459277723&w=468&lmt=1573371874&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=1573371874130&bpp=8&bdt=152&fdt=60&idt=60&shv=r20191106&cbv=r20190131&saldr=aa&abxe=1&correlator=3093041849579&frm=20&pv=2&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&ga_fc=0&iag=0&icsg=2251851588218866&dssz=55&mdo=0&mso=0&u_tz=60&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=20040031&oid=3&pvsid=107113790445042&rx=0&eae=0&fc=896&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=rQbMRbySiw&p=https%3A//www.giga.de&dtd=72
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191106/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::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=1459277723&w=468&lmt=1573371874&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=1573371874130&bpp=8&bdt=152&fdt=60&idt=60&shv=r20191106&cbv=r20190131&saldr=aa&abxe=1&correlator=3093041849579&frm=20&pv=2&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&ga_fc=0&iag=0&icsg=2251851588218866&dssz=55&mdo=0&mso=0&u_tz=60&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=20040031&oid=3&pvsid=107113790445042&rx=0&eae=0&fc=896&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=rQbMRbySiw&p=https%3A//www.giga.de&dtd=72
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/78.0.3904.70 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/78.0.3904.70 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, 10 Nov 2019 07:44:34 GMT
server
cafe
content-length
23379
x-xss-protection
0
set-cookie
IDE=AHWqTUljsMukHzpHch-SoedIlDn8JfN5Oj2bpC_-bw-w-m8KcAuL-1HFEMm95wz2; expires=Fri, 04-Dec-2020 07:44:34 GMT; path=/; domain=.doubleclick.net; HttpOnly test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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, 10 Nov 2019 07:44:34 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
78 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/r20191106/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
fc2c078ff7dbfc4334dc543b2fb93107671a69ebdeee982e1f8b866e252ea322
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573228288990065"
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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
29485
x-xss-protection
0
expires
Sun, 10 Nov 2019 07:44:34 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-c0b8abd8b0.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
1913b934223d7e3778e936702f58e12a08e0ef0dc8a81d991f3e1779baa6b570

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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
BzN6w2o8vtgruv6twGf.OVr0brTgZw4Q
content-encoding
gzip
etag
"9bcb6543393f168c97ba100e7347c7f3"
age
20
x-cache
HIT
status
200
content-length
22123
x-amz-id-2
2F29MqIVeWZ+5mwWyc5MmC7B8i73gO+fjZ4iCpciso84wTpydl163mOqHu3nylGhItzMihvBkrM=
x-served-by
cache-fra19166-FRA
last-modified
Thu, 07 Nov 2019 09:21:46 GMT
server
AmazonS3
x-timer
S1573371874.220012,VS0,VE0
date
Sun, 10 Nov 2019 07:44:34 GMT
vary
Accept-Encoding
x-amz-request-id
7906E69497B630C7
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
56
x-cache-hits
4
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=659803704
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 30 Oct 2019 09:04:07 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
945627
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=1898361861
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 30 Oct 2019 09:04:07 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
945627
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
102 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&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=1593725333
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 30 Oct 2019 09:04:07 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
945627
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=307124512
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 30 Oct 2019 09:04:07 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
945627
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Paypal%20(Android)%20downloaden*&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=1939125127
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 30 Oct 2019 09:04:07 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
945627
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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(iOS)%20downloaden*&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=990166929
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 30 Oct 2019 09:04:07 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
945627
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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(Windows%20Phone)%20downloaden*&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=1849341536
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 30 Oct 2019 09:04:07 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
945627
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
pubads_impl_2019103101.js
securepubads.g.doubleclick.net/gpt/
159 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.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
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
e4ab34b8a905b1076f36fddd2dc1e2dacd9c1bbca6614ab260e9b40aa0dced41
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 31 Oct 2019 13:10:21 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
59272
x-xss-protection
0
expires
Sun, 10 Nov 2019 07:44:34 GMT
fetch_frame_2019103101.html
ff.doubleclick.net/tag/js/ Frame ECC9
0
0
Document
General
Full URL
https://ff.doubleclick.net/tag/js/fetch_frame_2019103101.html
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
2a00:1450:4001:81e::2006 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
ff.doubleclick.net
:scheme
https
:path
/tag/js/fetch_frame_2019103101.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/78.0.3904.70 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
IDE=AHWqTUkuRxREe0l6jzVhdQenTBfzPMkXhJAQDafThPO6Isjx0OVPYTnNUYhSa55m
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 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
6667
date
Sun, 10 Nov 2019 07:05:09 GMT
expires
Mon, 09 Nov 2020 07:05:09 GMT
last-modified
Thu, 31 Oct 2019 13:10:21 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
2365
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
session
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
240 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/session
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
52.29.12.192 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-29-12-192.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 10 Nov 2019 07:44:35 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
bid
c.amazon-adsystem.com/e/dtb/
98 B
487 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=ZfnwYYD1q3yTA&cb=0&ws=1600x1200&v=7.42.00&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%2C%22301x601%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%5D&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
143.204.90.242 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-90-242.fra50.r.cloudfront.net
Software
Server /
Resource Hash
e48f08b200b1d8a4054305847126d87a19219dfb882be603e9c3b30f4062a6bc

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA50-C1
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
113
via
1.1 ba77f90aac0ddbc2c4c2c02062fac762.cloudfront.net (CloudFront)
x-amz-cf-id
VGVCNCz_jakJRiLeqkybCxAkCyNKa_j2lizj9d1gNVuVWVszVq1xog==
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=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=40ca676e-dda8-465a-8d93-673466dadc1b%2C550c8dc1-6b21-4bba-887c-a4e8be6d83e3%2Ccc026f7f-c16a-40c3-b594-bd6a234b92ba&nocache=1573371874306&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%2C301x601%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.167.1 /
Resource Hash
8e82af12eb1ae5cde2f667f9b8542354d8b7ad194664bec310f02a6f760785e2

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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 google
server
OXGW/16.167.1
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
4402
expires
Mon, 26 Jul 1997 05:00:00 GMT
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
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
185.86.139.58 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:33 GMT
X-SMRT-D
6%3b1%3b102
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
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
185.86.139.58 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 GMT
X-SMRT-D
6%3b23%3b121
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
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
185.86.139.58 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 GMT
X-SMRT-D
6%3b20%3b124
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
translator
hbopenbid.pubmatic.com/
0
114 B
XHR
General
Full URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
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
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC - PubMatic, Inc., US),
Reverse DNS
Software
/
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Sun, 10 Nov 2019 07:44:34 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.giga.de
cygnus
as-sec.casalemedia.com/
25 B
901 B
XHR
General
Full URL
https://as-sec.casalemedia.com/cygnus?s=254711&v=7.2&r=%7B%22id%22%3A%221386831950bc593%22%2C%22imp%22%3A%5B%7B%22id%22%3A%22142106a02eb474c%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%22151516c565265fa%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%2216c684e3e529394%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%2217f995be540fe25%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%2218e25599ba89b77%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%221913583e1130284%22%2C%22banner%22%3A%7B%22w%22%3A301%2C%22h%22%3A601%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%222079f0dd11fa047%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%2221cad80940e1be1%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%2222b8982c176143c%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%2223dfa2715bc4da%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&
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.234.21 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-21.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
603b80da5576a7fd6baa46e63201e4d23d7408ecd9f9a6c80380a49d4c25b27a

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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3p
policyref="/w3c/p3p.xml", CP="NOI DSP COR DEVa TAIa OUR BUS UNI"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
max-age=0, no-cache, no-store
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json
Content-Length
45
Expires
Sun, 10 Nov 2019 07:44:34 GMT
auction
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
240 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/auction
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
52.29.12.192 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-29-12-192.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 10 Nov 2019 07:44:35 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
submit
lb95.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb95.s400.meetrics.net/bb-mx/submit?/jD1sBHAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSVCBPAAAAAAAAAOAAAAGAAAAAAAZwSVCBBRksFAQtjF8xZ9SA
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.15 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h217.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Sun, 10 Nov 2019 07:44:33 GMT
data
lb95.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb95.s400.meetrics.net/data?/jD1sCHAAATkzFARksFAQtjF7qJNSA
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.15 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h217.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 10-Nov-19 07:44:33 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-5cb802ef9b.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::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/78.0.3904.70 Safari/537.36

Response headers

date
Mon, 28 Oct 2019 23:33:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
1066257
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,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, 27 Oct 2020 23:33:37 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 2CDB
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1573371874&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=1573371874138&bpp=3&bdt=160&fdt=192&idt=192&shv=r20191106&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=3093041849579&frm=20&pv=1&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&ga_fc=0&iag=0&icsg=828392537890&dssz=59&mdo=0&mso=0&u_tz=60&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=20040031&oid=3&pvsid=107113790445042&rx=0&eae=2&fc=896&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=197
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191106/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::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=1573371874&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=1573371874138&bpp=3&bdt=160&fdt=192&idt=192&shv=r20191106&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=3093041849579&frm=20&pv=1&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&ga_fc=0&iag=0&icsg=828392537890&dssz=59&mdo=0&mso=0&u_tz=60&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=20040031&oid=3&pvsid=107113790445042&rx=0&eae=2&fc=896&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=197
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/78.0.3904.70 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
IDE=AHWqTUkuRxREe0l6jzVhdQenTBfzPMkXhJAQDafThPO6Isjx0OVPYTnNUYhSa55m
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 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, 10 Nov 2019 07:44:34 GMT
server
cafe
content-length
0
x-xss-protection
0
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
delivery.ads.tqR-unHBZhKCE1.gif
www.giga.de/imagex/
71 B
474 B
Image
General
Full URL
https://www.giga.de/imagex/delivery.ads.tqR-unHBZhKCE1.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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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
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-5cb802ef9b.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/78.0.3904.70 Safari/537.36

Response headers

date
Mon, 20 May 2019 10:19:29 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:29 GMT
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=1027592297
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 30 Oct 2019 09:04:07 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
945627
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
impl.20191106-19-RELEASE.js
cdn.taboola.com/libtrc/
415 KB
117 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20191106-19-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.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
6a1d3602e9d7b62d01c879633c85e5967b296c3baca64dc540ce65e9909ec80d

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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
Q8cYXTcX1eVTaingzHyBrN0iF5wBePb9
content-encoding
gzip
etag
"5985d2c15a67a40c5ad6275b6cdf93b9"
age
120
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
119495
x-amz-id-2
SVESyLjrXkV+1HbPn1yA1PWyyc5bw6lnK/qm9mG68Wk91U2Bjpxo4hTmpLSm8gRrHCgKnpR4cgY=
x-served-by
cache-fra19166-FRA
last-modified
Wed, 06 Nov 2019 14:37:26 GMT
server
AmazonS3
x-timer
S1573371874.396074,VS0,VE0
date
Sun, 10 Nov 2019 07:44:34 GMT
vary
Accept-Encoding
x-amz-request-id
F400DA0555E6EEA8
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
15
x-cache-hits
521
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
2.19.43.224 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-43-224.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d0fd74148f4cbe78bd0e6328dc5ce5955f0a0ecdb1eb2919da4a7e596ac65912

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 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
901
Expires
Mon, 11 Nov 2019 07:44:34 GMT
ads
securepubads.g.doubleclick.net/gampad/
13 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=107113790445042&correlator=356948299328295&output=ldjh&impl=fif&adsid=NT&eid=21065107%2C21062452%2C21062889&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191110&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%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%3D16%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dd15aed7237d248b60bed57f124711de3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1573371874&dt=1573371874480&dlt=1573371873978&idt=466&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2257154448&uci=1&ifi=2&u_tz=60&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=3313570151566&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
5b750985d245681e7b816c1c69da434ead04cacadd0adc6746c080f8af1275cd
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5173
x-xss-protection
0
google-lineitem-id
5208879490
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138292660594
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_2019103101.js
securepubads.g.doubleclick.net/gpt/
64 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
5075b0d31c00903c1a8f437e6e356da4ebf9fe7066ac6809427d184b55fc382c
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 31 Oct 2019 13:10:21 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
25134
x-xss-protection
0
expires
Sun, 10 Nov 2019 07:44:34 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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/78.0.3904.70 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/
8 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=107113790445042&correlator=356948299328295&output=ldjh&impl=fif&adsid=NT&eid=21065107%2C21062452%2C21062889&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191110&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%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%3D16%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dd15aed7237d248b60bed57f124711de3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1573371874&dt=1573371874490&dlt=1573371873978&idt=466&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2778923653&uci=2&ifi=3&u_tz=60&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=63&icsg=3313570151566&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
8b82f283e3f518b44dd6050d8dfca59cb318704bed72073384be1140d9a9599d
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3586
x-xss-protection
0
google-lineitem-id
5208879490
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138292660726
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/
8 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=107113790445042&correlator=356948299328295&output=ldjh&impl=fif&adsid=NT&eid=21065107%2C21062452%2C21062889&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191110&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%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%3D16%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dd15aed7237d248b60bed57f124711de3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1573371874&dt=1573371874494&dlt=1573371873978&idt=466&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1428895410&uci=3&ifi=4&u_tz=60&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=63&icsg=3313570151566&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
73419ec87d237765f7eb660f382f3d3c04940c984ad03317084a9e75e3036cb9
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:35 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3569
x-xss-protection
0
google-lineitem-id
5198271552
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138290833185
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/
3 KB
2 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=107113790445042&correlator=356948299328295&output=ldjh&impl=fif&adsid=NT&eid=21065107%2C21062452%2C21062889&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191110&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%3D16%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dd15aed7237d248b60bed57f124711de3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1573371874&dt=1573371874497&dlt=1573371873978&idt=466&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858375612&uci=4&ifi=5&u_tz=60&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=63&icsg=3313570151566&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&fws=640&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
4206f29e9bd4eebc2ab50230ef824e1b344bdf2e467a84ff2be6aff62ca850dc
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:35 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
1806
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
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-5cb802ef9b.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:3b , 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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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
bid
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
240 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/bid
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
52.29.12.192 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-29-12-192.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
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/78.0.3904.70 Safari/537.36
Content-Type
text/plain

Response headers

date
Sun, 10 Nov 2019 07:44:35 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
nuggad
ih.adscale.de/
49 B
487 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=1&d10=1&d2=2&d4=0&d11=0&d8=2&d9=3&d12=3&d1=1&d3=3
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

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 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, 10 Nov 2019 07:44:34 GMT
api
cdn.m6r.eu/sync/
1 KB
1 KB
Script
General
Full URL
https://cdn.m6r.eu/sync/api
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.daa0a919cde011858b81e921cdd94d2f.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
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
Content-Encoding
gzip
Last-Modified
Tue, 22 Oct 2019 07:34:41 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
max-age=86400
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654
Expires
Mon, 11 Nov 2019 07:44:34 GMT
Cookie set /
d.agkn.com/iframe/8613/ Frame BE0A
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=289353145&gdpr=1&gdpr_consent=&ref=&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.238.200 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-238-200.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/78.0.3904.70 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/78.0.3904.70 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, 10 Nov 2019 07:44:33 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%3Awrhmv6Jwb7EA2WPEZeGnhEoPGYYjopK7;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlWnxiJVp8YgAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
482
Connection
keep-alive
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=1175
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ac0d , 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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 google
cf-cache-status
HIT
age
1033467
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
533666e7ddb4cb9c-VIE
expires
Wed, 28 Oct 2020 08:40:03 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.113.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
6753fe21faadf756564a95e3e6e6af88417c1d46bcdaed411cb8e606fe53f7e8

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
Content-Encoding
gzip
Age
576
X-Cache
HIT
Connection
keep-alive
Content-Length
12529
x-amz-id-2
f9RpdrHarOOhXiK6dvjtIVIbbQtN9p67ClBGZAywybRQLilostS0uywVtFxUVD4wMYxzmecY4Ao=
X-Served-By
cache-hhn4029-HHN
Last-Modified
Sun, 10 Nov 2019 07:21:23 GMT
Server
AmazonS3
X-Timer
S1573371875.551351,VS0,VE0
ETag
"0a0240b500fad1fd6c8bcfa74c2ca078"
x-amz-request-id
4E0E8F2658BFBB00
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
1047
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/ Frame 2A06
30 KB
30 KB
Image
General
Full URL
https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
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
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Sat, 02 Nov 2019 07:42:03 GMT
x-content-type-options
nosniff
age
691351
filer-source
ce88ec61ef2b0ae3c6dce1f364e04b3dccdbf411589c67a9af3271f22f2780da
x-cache
HIT
status
200
accept-language
bytes
content-length
30682
x-xss-protection
1; mode=block
last-modified
Sat, 02 Nov 2019 07:42:03 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, 02 Dec 2019 07:42:03 GMT
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame A16C
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.216.48 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/78.0.3904.70 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=A1mizAssAEdalCH_WsTVDdM|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/78.0.3904.70 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, 10 Nov 2019 07:44:34 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=A1mizAssAEdalCH_WsTVDdM; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 07:44:34 GMT; Path=/; HttpOnly ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jan-2025 07:44:34 GMT; Path=/; HttpOnly
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Sun, 10 Nov 2019 07:44:34 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=A1mizAssAEdalCH_WsTVDdM|t; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 07:44:34 GMT; Path=/; HttpOnly
Vary
User-Agent
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.5%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.5&cd44=1&cm1=1&z=1122986495
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 30 Oct 2019 09:04:07 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
945627
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
2be29099-93b5-413a-98b2-d34c9db012d6
https://videos.giga.de/ Frame 2A06
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/2be29099-93b5-413a-98b2-d34c9db012d6
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.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/78.0.3904.70 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 2A06
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-ff0ddd6c.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.72.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
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:35 GMT
Last-Modified
Sun, 10 Nov 2019 06:03:36 GMT
Server
AmazonS3
x-amz-request-id
35B0C0928CCBC443
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
mW3qGp9hM/TNgH+T4UhpOWBuvPv072atNYjUUfxzqGXn42Rpa5SrqdoxNjdy+2z2yUaZEi6Gck0=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 2A06
265 B
438 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-ff0ddd6c.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
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 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, 10 Nov 2019 07:59:34 GMT
json
trc.taboola.com/stroeer-smb-giga/trc/3/
16 KB
7 KB
Script
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=08%3A44%3A34.594&lti=deflated&data=%7B%22id%22%3A63%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%3A1573371874588%2C%22cv%22%3A%2220191106-19-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%221%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%3A4135%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%3A3452.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.20191106-19-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
d25307552c3d68bb4f0ac3bb468ab6f77e3755f64d6a0bb49ac9409dd3c3298b

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/78.0.3904.70 Safari/537.36

Response headers

x-vcl-time-ms
211
date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
access-control-allow-origin
*
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"
status
200
x-served-by
cache-fra19166-FRA
server
nginx
x-timer
S1573371875.599960,VS0,VE211
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1573371874603&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%...
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573371874603&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573371874603&ns_c=UTF-8&cv=3.1&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
2.19.43.224 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-43-224.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 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

Redirect headers

Location
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573371874603&ns_c=UTF-8&cv=3.1&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=
Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 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
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 2A06
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-ff0ddd6c.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.125 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-125.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

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

Response headers

Date
Sun, 10 Nov 2019 07:44:29 GMT
Via
1.1 f046bfa1468bb4385e357c8c9128cf51.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
7
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
FRA2-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
FKgOLIQAYa_K868qGOTyWHKTK393lpb-tHVrHcclwHBloVitT2oCpA==
Expires
0
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201910171256/
28 KB
11 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201910171256/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.113.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
51fbe136f28f60bc09b2a92ec09f109e560fb76b14d564e46fbd39cc6020f425

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
Content-Encoding
gzip
Age
626
X-Cache
HIT
Connection
keep-alive
Content-Length
10727
x-amz-id-2
H3hiFpPQwhEr6WsxB5NI4Ks7EFNhR8e4AJkFYmlaPm0CA8SXAYYjgz5mlgqfViLhAJES1cBa4Uo=
X-Served-By
cache-hhn4029-HHN
Last-Modified
Thu, 17 Oct 2019 18:13:36 GMT
Server
AmazonS3
X-Timer
S1573371875.662940,VS0,VE0
ETag
"084deea6f314d94436d69a233e4af5e3"
x-amz-request-id
55F7D1EC2D314E0D
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
998
container
tracking.m6r.eu/pixel/
2 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n19=1&n121=2&n116=0&n24=2&n104=0&n15=3&n155=1&n133=1&n106=1&n153=0&n11=1&n120=2&n154=1&n125=0&n8=1&n2=2&n137=0&n101=0&n108=1&n54=0&n110=0&n87=0&n149=0&n76=1&n66=1&n60=1&n139=0&n160=0&n107=1&n21=1&n40=1&n117=2&n86=1&n147=4&n64=0&n119=6&n22=1&n18=1&n161=1&n126=1&n92=3&n57=1&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=1&n12=0&n141=0&n157=0&n99=1&n128=1&n118=5&n85=0&n9=0&n23=1&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=0&n79=0&n93=4&n90=1&n43=1&n55=1&n142=0&n7=3&n103=0&n158=1&n124=1&n75=1&n91=0&n114=1&n69=0&n47=1&n10=3&n3=1&n82=1&n84=1&n5=3&n48=1&n109=0&n122=1&n67=1&n115=1&n89=1&n123=2&n17=1&n78=0&n44=1&n81=1&n88=1&n39=1&n156=1&n148=1
Requested by
Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.3, , 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
2cf2824d7273536f38f615aa482c2a6e8581dee8b688d46c938f6dd987ed91ce

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 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
1271
/
d.nativendo.de/cds/delivery/get/
10 KB
3 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=1175
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
014a785cbc3e96e7389a2d9019142a58b6e5a9ee699764eb3123113cdd8ad81a

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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
last-modified
Sun, 10 Nov 2019 07:44:34 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
2131
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
native
native.adscale.de/
157 B
602 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=1175
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
184.30.220.71 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a184-30-220-71.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
6eeedc8575b2952c7a1825a1f3dc4790b618a579ac5c79157cbf29d5b1e1d7b2

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/78.0.3904.70 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

Date
Sun, 10 Nov 2019 07:44:35 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
m
ad.yieldlab.net/
Redirect Chain
  • https://tracking.m6r.eu/sync/yieldlabRedirect
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=d15aed7237d248b60bed57f124711de3
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=d15aed7237d248b60bed57f124711de3
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 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, 09 Nov 2019 07:44:34 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=d15aed7237d248b60bed57f124711de3
Date
Sun, 10 Nov 2019 07:44:34 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.3, , 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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
feed-card-placeholder.20191106-19-RELEASE.es6.js
cdn.taboola.com/libtrc/
5 KB
2 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/feed-card-placeholder.20191106-19-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.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
6fdb632948703d1c6024ead3004a41c869c85a572e4a10eea092fb8af4e0353f

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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
.mLpqPXFL9EskZSOVOySi1PX76vcKX0T
content-encoding
gzip
etag
"cc76cbf23e98d65f4e1348c978e5fcf9"
age
36
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1269
x-amz-id-2
h2lBUJGJI14TArih0jPJ1QykQH5Q3/FuUB2pOhPIrkoZKogr8njPVORM1vhnuUznSNEIP769nnM=
x-served-by
cache-fra19166-FRA
last-modified
Wed, 06 Nov 2019 14:37:42 GMT
server
AmazonS3
x-timer
S1573371875.825861,VS0,VE0
date
Sun, 10 Nov 2019 07:44:34 GMT
vary
Accept-Encoding
x-amz-request-id
4204EA84590D51E6
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
99
x-cache-hits
156
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.20191106-19-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
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
cMrDKn.emLmm9kiiOOF64ulDT4DRy6LK
content-encoding
gzip
etag
"b8b410e4b18d45aa2f3d9bc09cd335fb"
age
6
via
1.1 varnish
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
AWcIhzzomFpHe8si5YbJiVnnNX5t8zaqWT6iUnl1jrs0orHCeA8qFpBimZz6F0EbOu64vJC5TJQ=
x-served-by
cache-fra19166-FRA
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1573371875.828095,VS0,VE0
date
Sun, 10 Nov 2019 07:44:34 GMT
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
581ABC3EA067DAB9
access-control-allow-origin
*
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
99
x-cache-hits
16
userx.20191106-19-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20191106-19-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.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
1b52790c10dd5e76563e9dba76055d950648bb19ae249fbf1f15143618c06db9

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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
bnj9T3GG2rxyoteWh1npsxWq7NR2HDiM
content-encoding
gzip
etag
"0b8d4b3968de6673e130e7d181e60b9a"
age
10
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
7712
x-amz-id-2
cHLCJqRKvO6OYAAkI8HzZBQBs8fp3knuR7uAsnuJ8QPbYvs4ynmrUrGVmoxsqj5Dkg6phK4IWsk=
x-served-by
cache-fra19166-FRA
last-modified
Wed, 06 Nov 2019 14:37:35 GMT
server
AmazonS3
x-timer
S1573371875.836552,VS0,VE0
date
Sun, 10 Nov 2019 07:44:34 GMT
vary
Accept-Encoding
x-amz-request-id
2B60A5C56CEA44B4
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
99
x-cache-hits
13
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/ Frame D5ED
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=d83fb889-d96d-417d-9470-362dd1e8bf60
0
51 B
Image
General
Full URL
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=d83fb889-d96d-417d-9470-362dd1e8bf60
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/78.0.3904.70 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
server
nginx
x-timer
S1573371875.927257,VS0,VE9
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19166-FRA

Redirect headers

Location
//trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=d83fb889-d96d-417d-9470-362dd1e8bf60
Date
Sun, 10 Nov 2019 07:44:34 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 D5ED
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.165 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/78.0.3904.70 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
6f9fd0201ed801884e5299d5aabca094
Content-Type
image/gif
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame D5ED
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=QF8nanX9N_td2YMf25pT3mGEeHVBTdngNee6Uf2zSVI%3D
45 B
113 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=QF8nanX9N_td2YMf25pT3mGEeHVBTdngNee6Uf2zSVI%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/78.0.3904.70 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
server
nginx
x-timer
S1573371875.910451,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19166-FRA

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=QF8nanX9N_td2YMf25pT3mGEeHVBTdngNee6Uf2zSVI%3D
Date
Sun, 10 Nov 2019 07:44:34 GMT
Server
nginx
Connection
close
Etag
"QF8nanX9N_td2YMf25pT3mGEeHVBTdngNee6Uf2zSVI="
Content-Length
0
rtb-h
match.taboola.com/sg/mediamath-ssp-network/1/ Frame D5ED
Redirect Chain
  • https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=76a45dc7-b622-4f00-8757-0a5bf245e439
  • https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=76a45dc7-b622-4f00-8757-0a5bf245e439&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D76a45dc7-b622-4f0...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=76a45dc7-b622-4f00-8757-0a5bf245e439&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D76a45dc7-b622-4f00-8757-0a5bf245e439
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.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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1573371875.924723,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4068-HHN

Redirect headers

x-vcl-time-ms
9
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
server
nginx
x-timer
S1573371875.894482,VS0,VE9
x-served-by
cache-fra19166-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=76a45dc7-b622-4f00-8757-0a5bf245e439&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D76a45dc7-b622-4f00-8757-0a5bf245e439
accept-ranges
bytes
content-length
0
x-cache-hits
0
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/ Frame D5ED
Redirect Chain
  • https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%%
  • https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=PN5YqMWiXMVy&ev=1&pid=562107
0
52 B
Image
General
Full URL
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=PN5YqMWiXMVy&ev=1&pid=562107
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/78.0.3904.70 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
server
nginx
x-timer
S1573371875.893846,VS0,VE9
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19166-FRA

Redirect headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
Via
1.1 varnish
X-Cache
MISS
P3p
policyref="/bh/w3c/p3p.xml", CP="NOI DSP COR NID CURa DEVa PSAa OUR BUS COM NAV INT"
X-Cache-Hits
0
Connection
keep-alive
Content-Length
0
X-Served-By
cache-fra19138-FRA
Server
Jetty(9.4.7.v20170914)
Vary
Accept-Encoding
Content-Language
en
Location
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=PN5YqMWiXMVy&ev=1&pid=562107
Cache-Control
private, max-age=0, no-cache, no-store
Accept-Ranges
bytes
Content-Type
text/plain; charset=utf-8
Cw-Server
bh-deployment-549b6d8d5c-zphsk
Expires
-1
getuidnb
ib.adnxs.com/ Frame D5ED
43 B
691 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
185.33.223.83 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
250.bm-nginx-loadbalancer.mgmt.ams1.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:36 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 250.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.141:80
AN-X-Request-Uuid
eee1ca20-bd13-43e9-b905-2920b2d8f6e4
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 D5ED
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=CAESEF9VwtyjN7j89UH4vWrkL1s&google_cver=1
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEF9VwtyjN7j89UH4vWrkL1s&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3DCAESEF9VwtyjN7j89UH4vWrkL1s%26goo...
0
77 B
Image
General
Full URL
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEF9VwtyjN7j89UH4vWrkL1s&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3DCAESEF9VwtyjN7j89UH4vWrkL1s%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.114.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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1573371875.924157,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4068-HHN

Redirect headers

x-vcl-time-ms
8
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
server
nginx
x-timer
S1573371875.893731,VS0,VE8
x-served-by
cache-fra19166-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEF9VwtyjN7j89UH4vWrkL1s&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3DCAESEF9VwtyjN7j89UH4vWrkL1s%26google_cver%3D1
accept-ranges
bytes
content-length
0
x-cache-hits
0
getuidnb
ib.adnxs.com/ Frame D5ED
43 B
691 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
185.33.223.83 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
250.bm-nginx-loadbalancer.mgmt.ams1.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:36 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 250.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.165:80
AN-X-Request-Uuid
1f1eaaaf-7433-4a7b-8a4b-3baf12e9ab1b
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 D5ED
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=05c7807c-99ff-474e-9424-f93057e95431
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=05c7807c-99ff-474e-9424-f93057e95431&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D05c7807c-99ff-474e...
0
77 B
Image
General
Full URL
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=05c7807c-99ff-474e-9424-f93057e95431&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D05c7807c-99ff-474e-9424-f93057e95431
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.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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:35 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1573371875.084420,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4068-HHN

Redirect headers

x-vcl-time-ms
9
date
Sun, 10 Nov 2019 07:44:35 GMT
via
1.1 varnish
server
nginx
x-timer
S1573371875.071081,VS0,VE9
x-served-by
cache-fra19166-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=05c7807c-99ff-474e-9424-f93057e95431&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D05c7807c-99ff-474e-9424-f93057e95431
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/storygize-network/1/ Frame D5ED
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=77423821-afe9-440c-9acf-25eefbef82bd
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=77423821-afe9-440c-9acf-25eefbef82bd&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D77423821-afe9-440c-9a...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=77423821-afe9-440c-9acf-25eefbef82bd&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D77423821-afe9-440c-9acf-25eefbef82bd
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
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Sun, 10 Nov 2019 07:44:35 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1573371876.593624,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4068-HHN

Redirect headers

x-vcl-time-ms
9
date
Sun, 10 Nov 2019 07:44:35 GMT
via
1.1 varnish
server
nginx
x-timer
S1573371876.576364,VS0,VE9
x-served-by
cache-fra19166-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=77423821-afe9-440c-9acf-25eefbef82bd&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D77423821-afe9-440c-9acf-25eefbef82bd
accept-ranges
bytes
content-length
0
x-cache-hits
0
cookiesync
bttrack.com/pixel/ Frame D5ED
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/78.0.3904.70 Safari/537.36

Response headers

X-ServerName
Track003-dc3
Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:33 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 D5ED
0
293 B
Image
General
Full URL
https://cds.taboola.com/?uid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&_r=3033030
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.16.1 /
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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:35 GMT
Via
1.1 varnish
Server
nginx/1.16.1
X-Timer
S1573371875.083509,VS0,VE22
X-Served-By
cache-dca17749-DCA
X-Cache
MISS
x-envoy-upstream-service-time
0
Connection
close
Accept-Ranges
bytes
Content-Length
0
X-Cache-Hits
0
sync
x.bidswitch.net/ Frame D5ED
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola
  • https://odr.mookie1.com/t/v2/sync?tagid=V2_790378&src.visitorId=8372a621-8284-41b1-b96a-1233bf4d2702
  • https://aa.agkn.com/adscores/g.pixel?sid=9212302828&puid=10814409342764586437
  • https://odr.mookie1.com/t/v2?tagid=V2_785409&src.visitorId=266700603235000368849
  • https://x.bidswitch.net/sync?dsp_id=419&user_id=10814409342764586437
43 B
213 B
Image
General
Full URL
https://x.bidswitch.net/sync?dsp_id=419&user_id=10814409342764586437
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
52.58.36.240 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-58-36-240.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

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

Response headers

status
200
date
Sun, 10 Nov 2019 07:44:35 GMT
cache-control
no-cache, no-store, must-revalidate
content-type
image/gif
content-length
43
p3p
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"

Redirect headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 google
server
Apache
status
302
p3p
CP="NON DSP COR NID CURa PSAa PSDa OUR STP UNI COM NAV STA LOC OTC",policyref="/w3c/p3p.xml"
location
https://x.bidswitch.net/sync?dsp_id=419&user_id=10814409342764586437
cache-control
no-cache, no-store, must-revalidate
alt-svc
clear
content-length
0
x-application-context
application
expires
Thu, 01 Jan 1970 00:00:00 GMT
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cm73=1&cm13=1&z=1216638817
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:81b::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 30 Oct 2019 09:04:07 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
945627
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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
gen_204
pagead2.googlesyndication.com/pagead/
0
124 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&r=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&w=728&h=90
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:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:34 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 6B17
0
76 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvwIr4bGmvodKqxhJvky8hb22TiuM-D4ZYw66DJ-DaE6tHyPPqS4B0KsX8dEcsL7lIHDCgWiqjAIYCrNP-MnPCfzZjLEv19_m8tE9MzgeiSJCZcr8r93ut6RHDcPmlugit1SuTKuk-uuC4X85wCPoDffZcv2saZ22F34G1eng8DDc9julUKYwCb9JP8tnwSj9wgecYbsref_MdDvZOawBTlcVPmvydtrr0mD38uN-LfE4UCdGiwtzlrZGxm8H-0FPWJU6z2NpM9Nbpvg5DAJonE1vvyNlQD6cyBKPrUHN_S&sig=Cg0ArKJSzEIITM94nvxWEAE&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
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 10 Nov 2019 07:44:34 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
mtrcs_220434.js
s79.mxcdn.net/bb-mx/serve/ Frame 6B17
118 KB
46 KB
Script
General
Full URL
https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.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
e140d6344f8b0353f7cab1b3a16c4c30a735fb43e6575616e8c2ef7a896bf963

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 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=1800
Connection
keep-alive
Content-Type
text/javascript
Content-Length
46644
Expires
Sun, 10 Nov 2019 08:14:34 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 6B17
77 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_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
66557b1fd9e362afdfa527946d2f7702a2edd34c87797cfd6dfe2d9916d2af6b
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573228288990065"
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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
29293
x-xss-protection
0
expires
Sun, 10 Nov 2019 07:44:34 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 1A92
0
49 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvk3La_j6yhPayTODHZXORAAXsXb4yKbQcJjiDIN_HL2bTLYE3Jo6f9e9EV1HUrjS-ZEhBeq_QSxOpeUpzxUl-FvR7Me3Q0jxoAOXmVC16WvDh6Ev_S_i1C3nf81db12lf5Z8uQwIJ8fFPdJDpNSkMPZTYCcS3ReNo1n01Naac7Ji93ctD-3Ino9tM9DqSCoyj7nHWEBAjAbOKLw2n42gkj2Oc6FBhFP7n85hpyRu_Lq5eCtIqaIJBFw_Wvb1NTKT2PZT3cngX9ji2zzIYrOuSgWl_TgDA7CLz9ju0-yhrR&sig=Cg0ArKJSzJsFHExFylX0EAE&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
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 10 Nov 2019 07:44:34 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 1A92
77 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_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
66557b1fd9e362afdfa527946d2f7702a2edd34c87797cfd6dfe2d9916d2af6b
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573228288990065"
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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
29293
x-xss-protection
0
expires
Sun, 10 Nov 2019 07:44:34 GMT
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
261 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.20191106-19-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/78.0.3904.70 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
10
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
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"
status
204
x-served-by
cache-fra19166-FRA
pragma
no-cache
server
nginx
x-timer
S1573371875.884537,VS0,VE10
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
59 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.20191106-19-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/78.0.3904.70 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
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"
status
204
x-served-by
cache-fra19166-FRA
pragma
no-cache
server
nginx
x-timer
S1573371875.886105,VS0,VE9
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
56 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.20191106-19-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/78.0.3904.70 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
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"
status
204
x-served-by
cache-fra19166-FRA
pragma
no-cache
server
nginx
x-timer
S1573371875.886900,VS0,VE9
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
60 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.20191106-19-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/78.0.3904.70 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
11
date
Sun, 10 Nov 2019 07:44:34 GMT
via
1.1 varnish
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"
status
204
x-served-by
cache-fra19166-FRA
pragma
no-cache
server
nginx
x-timer
S1573371875.888093,VS0,VE11
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
727 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: s79.mxcdn.net
URL: https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.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
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
hL.cyLD7Q4TL5ceY.7JQwF9m5IYI8mkC
via
1.1 varnish
etag
"dfa7b52c86e56bd67fa4002f6ed19854"
age
13934
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
Vjnfq2okxpLEG/cBVxSfv3DOOCGN7KTpixt29L7DwUhoZL6eRlgDSODZqhfatrYL58q01gaLKf4=
x-served-by
cache-fra19166-FRA
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
S1573371875.912582,VS0,VE0
date
Sun, 10 Nov 2019 07:44:34 GMT
x-amz-request-id
F6D91014AAA6CDC4
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
99
x-cache-hits
5172
mtrcs_220434.js
s79.mxcdn.net/bb-mx/serve/
118 KB
46 KB
Script
General
Full URL
https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.js
Requested by
Host: s79.mxcdn.net
URL: https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.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
e140d6344f8b0353f7cab1b3a16c4c30a735fb43e6575616e8c2ef7a896bf963

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 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=1800
Connection
keep-alive
Content-Type
text/javascript
Content-Length
46644
Expires
Sun, 10 Nov 2019 08:14:34 GMT
truncated
/ Frame 6B17
212 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
1f38478b51d02ae82c2545731c6b66319a99178124f54879533e0a3c832aa0a1

Request headers

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

Response headers

Content-Type
image/png
gettag
s79.research.de.com/bb-mxad/
0
294 B
Script
General
Full URL
https://s79.research.de.com/bb-mxad/gettag
Requested by
Host: s79.mxcdn.net
URL: https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.45.203 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h552.meetrics.de
Software
nginx /
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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:34 GMT
Cache-control
private,must-revalidate
Server
nginx
Connection
keep-alive
Content-Type
text/javascript
Content-Length
0
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
submit
b63.s79.research.de.com/bb-mx/
43 B
291 B
Image
General
Full URL
https://b63.s79.research.de.com/bb-mx/submit?/wkgsBhAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtxAxtAw0AtxAy6AzwAtyAywA0zA0tAyuAxxAwtAz3A13A1wA4hELlnFB/k0FxBxgAwqFpkF9yAywA0zA0mAhkFj9B02AzzAxwAymAjwFpkF9yAz0Ax3A04A2mAzpF0lF9xA0wA15Az2AmwEshFjlF9yA14A42Ax2A24AmjEpkF95A3wA52Ay4A3mAzpF6lF9iEyhFukFivFvzF0lFymBjiF9xAy0A31A0wA02A2BEL2wFBLl1FC/2xFXCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgB3pFukFv3FftFznFgjEzzFf3FliFrpF0BFTkzF7FAAAAAAAZwSZVBPAAAAAAAAAOAAAAGAAAAAAAZwSZVBBPBAAAAAAAABemwASksF4BbAAAAAAAAAAAAEAAAemwAAAAAAAIAyzA0xA30A42AJAy1A44A2xA22A4BEHAx0Aw1A5zA2BEMAiyFhuFkiFvvFz0FlyFIA53Aw5A2yA43AHA02AzzAxwAyBEQtjF4eM9TA
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
78.46.46.82 Nuremberg, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h370.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Sun, 10 Nov 2019 07:44:33 GMT
userconnect.js
js.adscale.de/
13 KB
5 KB
Script
General
Full URL
https://js.adscale.de/userconnect.js
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
uCC6CzbG4eeBE1xtCmZfElydHe8jGhl9
Content-Encoding
gzip
Last-Modified
Sun, 06 Oct 2019 22:55:04 GMT
Server
AmazonS3
x-amz-request-id
DA58C8E6E607B595
ETag
"5378ec64224df70177fba5bf02e1eb95"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Sun, 10 Nov 2019 07:44:35 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4106
x-amz-id-2
B0ifqy7kTSRMisP8EQOLSQIlEgQOBuwlngT88E/RewsSP5wLKrSgyb4K1VeM7/4XxSFw9SyUpVU=
0
d.nativendo.de/cds/delivery/render/551aptz4/182yo/61a80/8tzb4/
4 KB
2 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/render/551aptz4/182yo/61a80/8tzb4/0
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
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
5ac6d3e00b64557c7e6f13c701d72b95236b82576421f5ee2f01e1b9855a3050

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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:35 GMT
content-encoding
gzip
last-modified
Sun, 10 Nov 2019 07:44:35 GMT
server
Apache
vary
Accept-Encoding
content-type
text/javascript; charset=utf8
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
alt-svc
clear
content-length
1606
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
3a9ab3d0-6c1f-4067-89f5-d604b89f16ee
t.nativendo.de/cds/tracking/event/
0
173 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/3a9ab3d0-6c1f-4067-89f5-d604b89f16ee?aid=182yo&floor=M2E5YWIzZDAtNmMxZi00MF8tiIgTaBr7qgf4oQ&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1573371875
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:35 GMT
via
1.1 google
last-modified
Sun, 10 Nov 2019 07:44:35 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
37c34ae9-8a53-442e-a7f2-0afcee501031.jpg
c.nativendo.de/cdn/asset/media/crt/52953/2/3/
31 KB
31 KB
Image
General
Full URL
https://c.nativendo.de/cdn/asset/media/crt/52953/2/3/37c34ae9-8a53-442e-a7f2-0afcee501031.jpg?v=1573029781&width=350
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
2606:4700:20::6819:ac0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
aef31448f7f21e08ff26f53e8fa6cd851021560ff282b59217920d31c9ade86a

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:35 GMT
via
1.1 google
cf-cache-status
HIT
age
244367
cf-polished
origSize=33921, status=webp_bigger
status
200
alt-svc
clear
content-length
32009
cf-bgj
imgq:100
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
image/jpeg
cache-control
public, max-age=31536000
accept-ranges
bytes
cf-ray
533666eb1d33cb9c-VIE
expires
Thu, 05 Nov 2020 23:01:55 GMT
ai.aspx
m.exactag.com/
43 B
655 B
Image
General
Full URL
https://m.exactag.com/ai.aspx?extProvId=52&extPu=teufel-adition&extCr=10588293&extPm=3402548&extLi=786240&subid=1945037
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
213.202.235.9 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
Microsoft-IIS/8.5 / ASP.NET
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:34 GMT
X-ET-Code
0
Server
Microsoft-IIS/8.5
X-AspNet-Version
4.0.30319
X-Powered-By
ASP.NET
P3P
policyref="https://m.exactag.com/w3c/p3p.xml", CP="NOI NID STP STA CUR OUR"
Cache-Control
private
Last-Modified
So, 10 Nov 2019 07:44:34 GMT
X-ET-Camp
1192
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
1x1.gif
cdn.exactag.com/
799 B
1 KB
Image
General
Full URL
https://cdn.exactag.com/1x1.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.3, , AES_256_GCM
Server
185.59.220.19 Frankfurt am Main, Germany, ASN60068 (CDN77, GB),
Reverse DNS
frankfurt-10.cdn77.com
Software
CDN77-Turbo /
Resource Hash
86927cafa657ae14a28bdca63befb837251fc4ce67683aa19fdccf4d1bfeef3b

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:35 GMT
last-modified
Fri, 10 Aug 2012 06:52:09 GMT
server
CDN77-Turbo
x-edge-location
frankfurtDE
etag
"5024af99-31f"
status
200
x-cache
HIT
content-type
image/gif
access-control-allow-origin
*
x-edge-ip
185.59.220.10
x-age
352
accept-ranges
bytes
content-length
799
3a9ab3d0-6c1f-4067-89f5-d604b89f16ee
t.nativendo.de/cds/tracking/event/
0
171 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/3a9ab3d0-6c1f-4067-89f5-d604b89f16ee?noc=551aptz4&aid=182yo&cid=61a80&cti=8tzb4&imp=12&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1573371875
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:35 GMT
via
1.1 google
last-modified
Sun, 10 Nov 2019 07:44:35 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
view
securepubads.g.doubleclick.net/pcs/ Frame 0910
0
58 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssHeN_3NkmHSdKQBS-drZb8y_9R7LzbuljG3pGdXq58DJKcsX6Tk0AOeuel88bST3eN64lfIVfD0cF1Dk_jE7yys1x2qH0-B1P96Z-HO0OJVBNUjeDsENLTILDot_c-fLp-pzzPAMt_0xRju11BwDYHGw49dco_JRYTWXguaIA4lvSWNP77Ur0CN8wHnjDH5wuKe_8boDIKzNgj1CwoxvCZvS0_wnAbQ-U2CTW5iri_HozHvkh1y4NC0vTs2ohcNHD6NJASvxt6UApvpw9MaiR-CrTHTRD2d3egJbnEJ6Rimgf1OiPDcug1pD4&sig=Cg0ArKJSzPBZzraxNkXxEAE&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
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-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/78.0.3904.70 Safari/537.36

Response headers

timing-allow-origin
*
date
Sun, 10 Nov 2019 07:44:35 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
dcmads.js
fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/ Frame 0910
197 KB
67 KB
Script
General
Full URL
https://fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/dcmads.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019103101.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.24 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.fw.adsafeprotected.com
Software
nginx /
Resource Hash
2f2a0b01f66a476f1d93b87aba36ff27b0290bd7b654d19c2e4d29a4ec2e91d6

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
Content-Encoding
gzip
X-Server-Name
app54ami.ami.303net.pvt
Transfer-Encoding
chunked
Content-Type
application/javascript;charset=utf-8
Access-Control-Allow-Origin
fw.adsafeprotected.com
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Server
nginx
Expires
Wed, 31 Dec 1969 23:59:59 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 0910
77 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_2019103101.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
66557b1fd9e362afdfa527946d2f7702a2edd34c87797cfd6dfe2d9916d2af6b
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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:35 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573228288990065"
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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
29293
x-xss-protection
0
expires
Sun, 10 Nov 2019 07:44:35 GMT
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame CFE6
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvBWsVqj0CYgS_6RgxlNhfOvyvUQmGQ1SiA1Si64DlcSDOytNfOxfjwQDxaoMoXBNuw-2_jFxcmL8flhqtEZTQ79zGLxzymF7qrqz7EnUHFxWy99hCCW5dYlmNUNTJxRzvkIoOgP2K20...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
344 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:2bc::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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:35 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
status
200
etag
"3260aadd174a1ebd50d0bd967c8fadea:1494950026"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
access-control-allow-origin
*
cache-control
max-age=102613
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Mon, 11 Nov 2019 12:14:48 GMT

Redirect headers

timing-allow-origin
*
date
Sun, 10 Nov 2019 07:44:35 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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
userconnect
ih.adscale.de/
95 B
364 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=192243&cbfn=stroeerCoreConnect&ts=1573371875069&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
70072788613bde80533a3cb95d5a16c924011004b1d861093610379370beb859

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
Server
Apache-Coyote/1.1
Content-Type
application/javascript
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
95
Expires
Sun, 10 Nov 2019 07:44:35 GMT
Cookie set map
ih.adscale.de/ Frame 7928
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/78.0.3904.70 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=3026ae73ab3849ef9e2fed8eeb3aaffe; tu=4#4161105543#48~d15aed7237d248b60bed57f124711de3~437047~0~0; ng=2#1289039436#26222864#0#d7~1&d10~1&d2~2&d4~0&d11~0&d8~2&d9~3&d12~3&d1~1&d3~3
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 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, 10 Nov 2019 07:44:35 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
Content-Length
671
Connection
keep-alive
Set-Cookie
tu=4#1715541663#48~d15aed7237d248b60bed57f124711de3~437047~0~0#101~~437047~437047~1#38~~437047~437047~1#39~~437047~437047~1#40~~437047~437047~1#72~~437047~437047~1#42~~437047~437047~1#75~~437047~437047~1#63~~437047~437047~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
data
lb95.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb95.s400.meetrics.net/data?/jD1sDdMAAKktFLkqFFlqwF23A52AwwA/k0FDEmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA4yA25A21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AywA44A35A05AwmAjpFk9BxzA4yA5yA22Aw1A50AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AywA44A35A05AwmAhwFk9B1yAw4A43A50A5wAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A30A5yA0BELlnFBUkzFnBPhJAAAAAAAB9gOAPBAAFAA9gOTA5iAPAAAlEA5BABA5iAZBAAOA55A55A85B55A58E55A55AFA15A01AzBErA5iAP3AAlEA5BAHA5iASksFJFjAAAAAAAAAAAAEAAA9gOAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA5yA22Aw1A50AGAkpFylFj0FAAAAIAy4Ay2A52A11AKA1yAw4A43A50A5wAGAihFuuFlyFKA1yAw4A43A50A5wAKA1yAw4A43A50A5wAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdlEA5BAoPAAAAFAAAA5iAAAAALAT1FwlFyCFhuFulFyBFAAAAAAAAAAAAAAAAQtjFAObBUA
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.15 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h217.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 10-Nov-19 07:44:34 GMT
3a9ab3d0-6c1f-4067-89f5-d604b89f16ee
t.nativendo.de/cds/tracking/event/
0
171 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/3a9ab3d0-6c1f-4067-89f5-d604b89f16ee?aid=182yo&t=data%2Finventory&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1573371875
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:35 GMT
via
1.1 google
last-modified
Sun, 10 Nov 2019 07:44:35 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
skeleton.js
static.adsafeprotected.com/ Frame 0910
Redirect Chain
  • https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754020/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-l...
  • https://static.adsafeprotected.com/skeleton.js
17 B
299 B
Script
General
Full URL
https://static.adsafeprotected.com/skeleton.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
199.166.0.32 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.static.adsafeprotected.com
Software
nginx /
Resource Hash
bdeed1e1c0751610c8f3dc2a5c78c93f841c366b36a7f7a54f5e6752c2656c05

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:35 GMT
Last-Modified
Thu, 19 Dec 2013 18:10:33 GMT
X-Server-Name
app38ami.ami.303net.pvt
ETag
"52b33699-11"
Content-Type
application/javascript
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
17
Server
nginx

Redirect headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
X-Server-Name
app54ami.ami.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Location
https://static.adsafeprotected.com/skeleton.js
Cache-Control
no-cache
Connection
keep-alive
Content-Length
0
Server
nginx
sca.17.4.95.js
static.adsafeprotected.com/ Frame 73B3
81 KB
20 KB
Script
General
Full URL
https://static.adsafeprotected.com/sca.17.4.95.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
199.166.0.32 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.static.adsafeprotected.com
Software
nginx /
Resource Hash
149c8d10677f2f6979fa28c078cf832f575ee53c397d791b739e7c4c687fe7bc

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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:35 GMT
Content-Encoding
gzip
Last-Modified
Tue, 19 Jun 2018 17:20:43 GMT
X-Server-Name
app38ami.ami.303net.pvt
ETag
"5b293b6b-4fda"
Content-Type
application/javascript
Cache-Control
max-age=315360000
Connection
keep-alive
Content-Length
20442
Server
nginx
Expires
Thu, 31 Dec 2037 23:55:55 GMT
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=df95007b-20b7-f7eb-5b61-3032a9ef8474&tv={c:tyizPF,pingTime:-2,time:55,type:a,im:{sf:0,pom:1,prf:{mdA:2,mdZ:89,beA:92,beZ:93,mfA:94,cmA:95,inA:95,inZ:99,prA:99,prZ:105,si:110,poA:111,poZ:115,cmZ:115,mfZ:115,loA:124,loZ:125,ltA:146,ltZ:146}},sca:{dfp:{df:4,sz:300.250,dom:ins}},env:{gca:0},clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:55,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[50~100],as:[50~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rHpa2Q8+11|12|1311|1312|1313|14|151|16|17|18|1911|1a|1b|1c|1d|1e*.346702-39754020|1f|1g,idMap:1e*,rend:0,renddet:WINDOW,rmeas:0,slid:[google_ads_iframe_4444/giga.de_sd/software_artikel_2,google_ads_iframe_4444/giga.de_sd/software_artikel_2__container__,sdgAdServerContainer-rectangle,rectangle-3],sinceFw:35,readyFired:true}&br=u
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
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
X-Server-Name
dt38.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
truncated
/ Frame 0910
210 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
482f2b0598b74a958dab3739a19d787ae1d100f7a60cd3949942ed81d9350195

Request headers

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

Response headers

Content-Type
image/png
data
lb95.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb95.s400.meetrics.net/data?/jD1sEJOAA/k0FTImvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA4yA25A21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AywA44A35A05AwmAjpFk9BxzA4yA5yA22Aw1A50AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AywA44A35A05AwmAhwFk9B1yAw4A43A50A5wAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A30A5yA0mEvyFthF0jFvkFl9B4tB1uFruFv3FutBx4ExmAhkF29By4A23A51A31AmjEwpFk9BklFzrF0vFwmBhwFh9B00A4yAz4A4yA5yAmjEpkF9xAz4AyxA2yA01Az3AymAzpF6lF9xA4xBmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9Bv1F0tBvmFtwEhnFlmBhwFj9B00A4yAz4A4yA5yAmhEwkF90A04AyzA44Ay5AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlmBhkFj9BHvFvnFslFgBEkYFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A31AxxAyBELlnFCUkzFYBPDCAAAAAAABipHAPAAAFAAipHThRjAPAAAAAAkaABhRjAZAAAOA55A55A85B55A58E55A55AFAzxAzzAwBErhRjASksFhFjAAAAAAAAAAAAEAAAipHAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAKAHvFvnFslFgBEkYFAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0tBvmFtwEhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlBFdAAAkaAAAAAAAFAAAhRjAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFscrKWA
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.15 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h217.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 10-Nov-19 07:44:34 GMT
data
lb95.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb95.s400.meetrics.net/data?/jD1sFKOAA/k0FhMmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA4yA25A21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AywA44A35A05AwmAjpFk9BxzA4yA5yA22Aw1A50AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AywA44A35A05AwmAhwFk9B1yAw4A43A50A5wAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A30A5yA0mEvyFthF0jFvkFl9B4tB1uFruFv3FutBx4ExmAhkF29By4A23A51A31AmjEwpFk9BklFzrF0vFwmBhwFh9B00A4yAz4A4yA5yAmjEpkF9xAz4AyxA2yA01Az3AymAzpF6lF9xA4xBmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9Bv1F0tBvmFtwEhnFlmBhwFj9B00A4yAz4A4yA5yAmhEwkF90A04AyzA44Ay5AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlmBhkFj9BHvFvnFslFgBEkYFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A31AxxAymEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29By4A01AwzA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA54Ay3Ax1A1yAmjEpkF9xAz4Ay5Aw4AzzAx4A1mAzpF6lF9zAwwA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA54Ay3Ax1A1yAmhEwkF91Ax5A4yA3xA11AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A31AyxA5BELlnFDTkzFtPrBAAAAAAABDWmAPAAAFAADWmTbosAPAAAJPAWEABbosASksFeFjAAAAAAAAAAAAEAAADWmAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA5wA4zAzxA41AGAkpFylFj0FAAAAIAy4A01AwzA31AKA1xA54Ay3Ax1A1yAJAylFj0FhuFnsFlBFKA1xA54Ay3Ax1A1yAKA1xA54Ay3Ax1A1yAzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAAbosAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFGA31YA
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.15 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h217.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 10-Nov-19 07:44:34 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame 2A06
191 KB
56 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=ZOZuiCUCwB
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.125 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-125.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
dd93b211db8ea6b337dd62aca09a1634d67878f5347ffe5d525da708e020f70c

Request headers

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

Response headers

Date
Sun, 10 Nov 2019 07:43:58 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
38
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Fri, 08 Nov 2019 15:38:44 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 f046bfa1468bb4385e357c8c9128cf51.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Pop
FRA2-C1
X-Amz-Cf-Id
cJ9J15C8EDD_kQCGuQedCWzjSmvx0D2EIEeqJl7rOxijhc_9xDTlSA==
data
b63.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://b63.s79.research.de.com/data?/wkgsCPHAALktFBLkqFFlqwFyyAw0Az0ATkzFPPLHAAAAAAAz3VGASksFeCd/EA+GAUHA8AAAAAA3VGAAAPAOPFfTFPVFSDFFfF20A22AzBECACBFAAAAAAAAAAAAAAGAJGFSBFNFFdJPAWEAsEA6DAAAAAJI2AAAQAOPFfTFPVFSDFFfFxxA01A22ACANSFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFrEiTSA
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
78.46.46.82 Nuremberg, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h370.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 10-Nov-19 07:44:34 GMT
data
b63.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://b63.s79.research.de.com/data?/wkgsDQHAATkzFASksFUXd/EA+GAUHA8AAAAAAF8FAAA+Oo0F0wFz6BvvAnvFvnFslFhkFzuBnuBkvF1iFslFjsFpjFruBulF0vBwhFnlFhkFvhEkzF/jEspFluF09BjhFtwE1iFtzA5zA54AxzAy4A3wAzwAw4A0mAv1F0wF10F9oE0tFsmBo9B2wAmzEsvF0uFhtFl9Bz4A31Aw2A05A13AmhEkrF9yAyxAwzA00A2wA4mAhkFm9Bx0A15Ay3A33AyzAm3E90A24AmsEt0F9xA13AzzA3xA43A0mAn1FjpF9xAuyAuwAuwAuyAuyAuwAuwAmmEvyFthF09B02A44E2wAm1EysF9oE00FwzFlzABlByGElyAG3F33FunEpnFhuBklFlyAG3FliFhwFwzFlyAGwFh5FwhFslByGE0pFwwFzlByGEwhF5wFhsFtsEvnFpuFtzEvtBnlFo0FztB1uFktBzvFtsEvlFz0FtpEoyFtsEvnFpuFtwEyvFisFltFllByGEmmEshFzoF9wAm3EnsF9xAmhEkzFpkF9OEUmBk0F9xA13AzzA3xA43A0xAzwAmiEwwF94AmiEk0F9xA1yAmmEk0F92AwmApkF09B2wAmzEo2F9yEywAx5AxxAw2AmjEi2F9yEywAx5AwxAzxAmzEhsFkyF9hEhmBhiF4lF9xAmjEvyFylFshF0vFy9BzwA5zAw0Ax4A05A13A5mAmyFt9BywAmwE29BymAnhFf2FpkF9xA2zAw2A31A14AwuAx1A3zAz3Ax4A30AmnEhfFzpFk9Bx1A3zAz3Ax4A30AmnEhfFopFk9Bx0A35AxwA01A25AmnEhfFmjF9wAmpEhnF9wAmpEjzFn9ByyA1xA41Ax1A44AyxA44A22AmkEzzF69B11AmtEkvF9wAmtEzvF9wAm1Ef0F69B2wAm1EfoFpzF9yAm1EfqFh2Fh9BwmA1fFo9BxyAwwAm1Ef3F9xA2wAwmA1fFhoF9xAywAwmA1fFh3F9xA2wAwmA1fFjkF9yA0mA1fFuwFs1Fn9BwmA1fFutFptFl9BwmAhkF49BzxA4mAhkF59B00A2mAipF39Bx1A41AmiEpoF9xAywAwmAzjFyfF49BwmAzjFyfF59BwmAlpFk9BywAw0AwwAzxAmvEpkF9zAmwE2zFpkF9xAw3AxxAz3A5wA00A1wA0yAmyE49BwmAlhFl9BwmAmjF94A52AmiEykFptF9wAlyADwBlyADwBlyADwBlyADxB2wAwlAyDEwlAyDEx2AwwAlyADxBywAwlAyDEx2AwwAlyADxBywAwmA2pFz9BxmAyzF69Bl3ADlB3DElFFl3ADmBhiFs9BDTFmwEm4F9wAmmE19Bx2AmiEj9BzxAmpEmpF9xAm1EjpF9hEhxAmmEziF9xAm4EwjF9yERiFNSFi5FTpF3mBw9Bo0F0wFzlBzBEvvA33F3uBnpFnhFukElmBk0Fk9B3yACACBFAAAAAAAAAAAAAAGAJGFSBFNFFQtjF6sw+XA
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
78.46.46.82 Nuremberg, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h370.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 10-Nov-19 07:44:34 GMT
data
b63.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://b63.s79.research.de.com/data?/wkgsEQHAA/k0FxBxgAwqFpkF9yAywA0zA0mAhkFj9B02AzzAxwAymAjwFpkF9yAz0Ax3A04A2mAzpF0lF9xA0wA15Az2AmwEshFjlF9yA14A42Ax2A24AmjEpkF95A3wA52Ay4A3mAzpF6lF9iEyhFukFivFvzF0lFymBjiF9xAy0A31A0wA02A2BElqwFyyAw0Az0ALkmFBTkzFARksFAQtjFwIYUSA
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
78.46.46.82 Nuremberg, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h370.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 10-Nov-19 07:44:34 GMT
truncated
/ Frame 2A06
191 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
dd93b211db8ea6b337dd62aca09a1634d67878f5347ffe5d525da708e020f70c

Request headers

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

Response headers

Content-Type
text/javascript
/
track.adform.net/Serving/Cookie/
90 B
467 B
Script
General
Full URL
https://track.adform.net/Serving/Cookie/?adfaction=getjs;adfcookname=uid
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.daa0a919cde011858b81e921cdd94d2f.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.6.245 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
8794def5656f38c34fe46816da7926a308c41f55306a290f298a2400feae1178

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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:35 GMT
content-encoding
gzip
server
nginx
status
200
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/javascript; charset=utf-8
content-length
198
expires
-1
f9b17833-d68c-4e4d-b319-d6061d45aa9f
boot.pubstack.io/v1/tag/
1 KB
827 B
Script
General
Full URL
https://boot.pubstack.io/v1/tag/f9b17833-d68c-4e4d-b319-d6061d45aa9f
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.daa0a919cde011858b81e921cdd94d2f.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.214.103.10 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-214-103-10.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
032d5b3efafad42cdec53e7650f403dac14f79e24bf8e08bcc80a44508c584ae

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/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Sun, 10 Nov 2019 07:44:35 GMT
cache-control
max-age=120
content-encoding
gzip
content-length
714
content-type
application/javascript
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
18 KB
18 KB
Fetch
General
Full URL
https://gocp.stroeermediabrands.de/absconf/www.giga.de/config.json?c=1573371875
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
7ee70a05b47281121926595010ff4b2a0646ed0cba9f08cba98cd4b834734592

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/78.0.3904.70 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Sun, 10 Nov 2019 07:44:36 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/78.0.3904.70 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

status
204
date
Sun, 10 Nov 2019 07:44:35 GMT
cache-control
max-age=0, no-cache
server
nginx
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=df95007b-20b7-f7eb-5b61-3032a9ef8474&tv={c:tyizUV,pingTime:-10,time:381,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.95v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC45NXYxMjAwfHwxNjAwfHwxfHwxfHwyNHx8MTIwMHx8MHx8MHx8MXx8bGFuZHNjYXBlLXByaW1hcnl8fDI0fHw0LzN8fDQvM3x8MHx8MTYwMA--,no:MTcuNC45NXZNb3ppbGxhfHxOZXRzY2FwZXx8bnx8MTZ8fG58fDB8fG58fExpbnV4IHg4Nl82NHx8R2Vja298fDIwMDMwMTA3fHwtNjB8fE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE0XzUpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83OC4wLjM5MDQuNzAgU2FmYXJpLzUzNy4zNnx8MXx8MXx8R29vZ2xlIEluYy58fG4-,asp:1573371875524||c40640bb00e64d954b56fefd57ca5a46||2843f8c0b82761982424c93233cd1ed5||8d39a2cdc1a80181be1bdc1f1f60d9b6||da63e48fd7138d4a8ece05fda5c62ca0||a636563c233984b453116f7b21a67e5a||9a2b39da10502651e7f3d5f4bcecc7a8||d73d6c03ff56f77156641e764805d12c||1529428597}
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
X-Server-Name
dt38.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.daa0a919cde011858b81e921cdd94d2f.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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
l7rX85QPBBoo6.Ijo6hDg0IGfcD14kv1
Content-Encoding
gzip
Last-Modified
Sun, 06 Oct 2019 22:55:03 GMT
Server
AmazonS3
x-amz-request-id
360E6D5F866269BE
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Sun, 10 Nov 2019 07:44:35 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
0lnSitnLCeETXaxn9OVbpvWcDygso97eVVZzAWSam171iPiaRMejLG2fjoLwd4swTdteaUST7rI=
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=92963825
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.daa0a919cde011858b81e921cdd94d2f.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.109 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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:35 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, 10 Nov 2019 07:49:35 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: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.daa0a919cde011858b81e921cdd94d2f.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.118 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn2.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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:35 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:12:13 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, 16 Nov 2019 20:14:05 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: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.daa0a919cde011858b81e921cdd94d2f.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.77.22.22 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-22-22.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/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Sun, 10 Nov 2019 07:44:35 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
531 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=30826692&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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:35 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
match
pixel.consentric.de/tp/
43 B
354 B
Image
General
Full URL
https://pixel.consentric.de/tp/match?trackingId=99643324124625111&partnerId=1200
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.138.221.190 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
aa03dc59bdca72631d2301e4297cfa030bd31b907dc138e7b973d12311c90a22
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:35 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Content-Type
image/gif
Access-Control-Allow-Origin
*
Cache-Control
private, no-cache, no-cache=Set-Cookie, proxy-revalidate
Content-Length
43
X-XSS-Protection
1; mode=block
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&_=1573371875534.-1250082532
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/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:35 GMT
Last-Modified
Thu, 07 Nov 2019 11:21:22 GMT
ETag
"5dc3fe32-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Content-Length
98
monitoring.js
cdn.prod.pubstack.io/
61 KB
19 KB
XHR
General
Full URL
https://cdn.prod.pubstack.io/monitoring.js
Requested by
Host: boot.pubstack.io
URL: https://boot.pubstack.io/v1/tag/f9b17833-d68c-4e4d-b319-d6061d45aa9f
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.76.218 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
218.76.95.34.bc.googleusercontent.com
Software
UploadServer /
Resource Hash
413364272994992257eb29f54a63fd828220d3217d8cf955e57f4edb3a4e3402

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:03:50 GMT
content-encoding
gzip
age
2445
x-guploader-uploadid
AEnB2Uqce46HWpF_ggtinSNUgYZhPpcCJtUEipQcS1T4y7B7Z8HOuGoMae3Z4-YSCS_Uz3wIH5URcV64-gaX3nNjd9-OP8TKGQ
x-goog-storage-class
STANDARD
status
200
x-goog-metageneration
2
x-goog-stored-content-encoding
gzip
alt-svc
clear
content-length
19109
last-modified
Thu, 07 Nov 2019 10:33:20 GMT
server
UploadServer
etag
"c99a31b57f67f7ef385a0bca9adb7bbe"
vary
Accept-Encoding
x-goog-hash
crc32c=tQKzsQ==, md5=yZoxtX9n9+84WgvKmtt7vg==
content-language
en
access-control-allow-origin
*
x-goog-generation
1573122800471985
access-control-expose-headers
Content-Length, Date, Server, Transfer-Encoding, X-GUploader-UploadID, X-Google-Trace
cache-control
public, max-age=3600
x-goog-stored-content-length
19109
accept-ranges
bytes
content-type
application/javascript
expires
Sun, 10 Nov 2019 08:03:50 GMT
segments
api.theadex.com/v0.9/pub/
56 B
127 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.121 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/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Sun, 10 Nov 2019 07:44:35 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:21f3:d400: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/78.0.3904.70 Safari/537.36

Response headers

date
Wed, 25 Sep 2019 11:24:12 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
3961224
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
FRA2-C2
content-type
application/javascript; charset=utf-8
x-amz-cf-id
ZzrZi-cd7aIw2-tDDXCEE3G4yzx8fO4gRQzllu9-cNikatrIDJjK2g==
via
1.1 a32f966fc5896281eb3de44fd8f57d40.cloudfront.net (CloudFront)
launcher.js
sak.userreport.com/sdm/
63 KB
20 KB
Script
General
Full URL
https://sak.userreport.com/sdm/launcher.js
Requested by
Host: nugmw.userreport.com
URL: https://nugmw.userreport.com/rc-ap/fdf60e3c-e1b8-428d-828b-8af24a3b50f1/si.nuggad.net/nuggad?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.101.24 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-24.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
4f3ec1226d44f2dbb1d6957395f1271c0717206886219d051228e69dff10513c

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/78.0.3904.70 Safari/537.36

Response headers

x-amz-version-id
IMogK55qKO1IHLdYEtGgaDgCZp65LBVz
content-encoding
gzip
last-modified
Fri, 01 Nov 2019 09:56:54 GMT
server
AmazonS3
age
263
date
Sun, 10 Nov 2019 07:40:12 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=300
x-amz-cf-pop
FRA50-C1
x-amz-cf-id
xDmM6ixtF9WCtqznWS6COLDvzZb01L9HWJCCP0sHBCErx6PbOL3u3A==
via
1.1 d55780b776b171387055eca956ae29a9.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%2F78.0.3904.70%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=d15aed7237d248b60bed57f124711de3&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=35525905206
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.77.22.22 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-22-22.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
dd0ed2aa79b978b0c5e0cf9cdedcd3271deadfdd80a7f1cf4f53ed27be199a03

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:35 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
63.34.92.224 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-34-92-224.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/78.0.3904.70 Safari/537.36

Response headers

Date
Wed, 06 Nov 2019 17:14:32 GMT
Content-Encoding
gzip
Last-Modified
Tue, 05 Nov 2019 18:54:02 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 2755
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBsBFBSJFWSRAWsUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4209144157264917545
42 B
665 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4209144157264917545
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.77.22.22 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-22-22.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/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Sun, 10 Nov 2019 07:44:35 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, 10 Nov 2019 07:44:35 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=4209144157264917545
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
activation
adstax-match.adrtx.net/ Frame E88F
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.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/78.0.3904.70 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/78.0.3904.70 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, 10 Nov 2019 07:44:35 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
5198271552
api.yieldlove-ad-serving.net/v1/bl/4444/
44 B
249 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5198271552
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
52.29.86.7 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-29-86-7.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
b2a27a31e9d34704f0c2adae8a77ce35e0bc3c352a40a682d89783142780c2f7

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/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:35 GMT
x-powered-by
Express
etag
W/"2c-wDll0Jp0iexOSFL7+9AsyW9PVP8"
x-key
/bl/4444/5198271552
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
44
error
intake.prod.pubstack.io/v1/intake/
0
58 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/error?sId=b090ce7b&c=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.2, ECDHE_RSA, AES_128_GCM
Server
54.171.34.13 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-171-34-13.eu-west-1.compute.amazonaws.com
Software
/
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/78.0.3904.70 Safari/537.36
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Sun, 10 Nov 2019 07:44:36 GMT
auction
intake.prod.pubstack.io/v1/intake/
0
58 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/auction?sId=b090ce7b&c=3
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.171.34.13 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-171-34-13.eu-west-1.compute.amazonaws.com
Software
/
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/78.0.3904.70 Safari/537.36
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Sun, 10 Nov 2019 07:44:36 GMT
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 2A06
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=4035595654
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.72.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
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:37 GMT
Last-Modified
Sun, 10 Nov 2019 06:03:36 GMT
Server
AmazonS3
x-amz-request-id
118A342123D67349
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
aYNx4F8N8oZ2lScD7GQ5mQat7T44pBGO0rOicRnh6Np825ynv3FTnMAKurek6GZ/CTzH1adCAuA=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 2A06
265 B
438 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=6477344309
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
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
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

date
Sun, 10 Nov 2019 07:44:36 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, 10 Nov 2019 07:59:36 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 2A06
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=7693458786
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.125 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-125.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

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

Response headers

Date
Sun, 10 Nov 2019 07:44:08 GMT
Via
1.1 f046bfa1468bb4385e357c8c9128cf51.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
70
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
FRA2-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
wPSrZ0y3e6bUK_NrhytOtUemtbfrA_7lZN8qAdwOE3y3e7ru_7DNvA==
Expires
0
/
ssl.3.damoh.giga.de/578eeaadc08deea6da5df97460114e34bf2bf3cb/ Frame 2A06
653 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.giga.de/578eeaadc08deea6da5df97460114e34bf2bf3cb/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.116.20 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.20.116.4.46.clients.your-server.de
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

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

Response headers

Date
Sun, 10 Nov 2019 07:44:36 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
de36-homad-1
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
hic_qos
ssl.1.damoh.giga.de/ Frame 2A06
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,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.51.163 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.163.51.251.148.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
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36

Response headers

Date
Sun, 10 Nov 2019 07:44:37 GMT
Last-Modified
Tue, 18 Jun 2019 07:28:00 GMT
Server
openresty/1.15.8.2
ETag
"5d089280-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 C8B6
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e29eb387f23907cbe6355d4dda4c204e494a74be0b12adf422490b11e2568f36

Request headers

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

Response headers

Content-Type
text/javascript
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=df95007b-20b7-f7eb-5b61-3032a9ef8474&tv={c:tyiA68,pingTime:1,time:1076,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1076,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1071~100],as:[1071~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:89,fm:rHpa2Q8+11|12|1311|1312|1313|14|151|16|17|18|1911|1a|1b|1c|1d|1e*.346702-39754020|1f|1g,idMap:1e*,rend:0,renddet:WINDOW,rmeas:0}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:36 GMT
X-Server-Name
dt38.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=df95007b-20b7-f7eb-5b61-3032a9ef8474&tv={c:tyiA69,pingTime:1,time:1077,type:c,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1077,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1072~100],as:[1072~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:89,fm:rHpa2Q8+11|12|1311|1312|1313|14|151|16|17|18|1911|1a|1b|1c|1d|1e*.346702-39754020|1f|1g,idMap:1e*,rend:0,renddet:WINDOW,rmeas:0,metricId:forwrd1}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:36 GMT
X-Server-Name
dt38.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
usersync
uss.xplosion.de/
42 B
665 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=d15aed7237d248b60bed57f124711de3
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.77.22.22 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-22-22.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/78.0.3904.70 Safari/537.36

Response headers

status
200
date
Sun, 10 Nov 2019 07:44:36 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"
activeview
pagead2.googlesyndication.com/pcs/ Frame 0910
42 B
111 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsubBe6l9JqseGdtZ_r9FkmvBUeJ8VjrgViLtnPvehMIEI8EQEFt3LU2JSWVwqVdyqYbN1ea_ndxSMwG6PaY7RahGKHXHcp45e8mieaixF4&sig=Cg0ArKJSzC5_eHq56jW3EAE&adk=1428895410&tt=748&bs=1585%2C1200&mtos=1018,1018,1018,1018,1018&tos=1018,0,0,0,0&p=278,968,528,1268&mcvt=1018&rs=3&ht=0&tfs=908&tls=1926&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=662&niot_cbk=671&md=2&lm=2&rst=1573371875055&rpt=166&isd=0&msd=0&imams=1&oseid=3&xdi=0&ps=1585%2C5721&ss=1600%2C1200&pt=1182&bin=1&deb=1-2-6-26-19-13-110-17-0-0-0&tvt=1924&r=v&id=osdim&vs=4&uc=10&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191108
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:825::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/78.0.3904.70 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 10 Nov 2019 07:44:36 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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,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
/
ssl.3.damoh.giga.de/62245006fcfec6556acff90f15be4dd5979adf5a/ Frame 2A06
109 B
671 B
XHR
General
Full URL
https://ssl.3.damoh.giga.de/62245006fcfec6556acff90f15be4dd5979adf5a/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.116.20 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.20.116.4.46.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

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

Response headers

Date
Sun, 10 Nov 2019 07:44:37 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
pd
eu-u.openx.net/w/1.0/ Frame 2238
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.167.1 /
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/78.0.3904.70 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=c9dc6cd2-296d-072a-03d5-6ac9adfdd4f9|1573371874; pd=v2|1573371874|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/78.0.3904.70 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=c9dc6cd2-296d-072a-03d5-6ac9adfdd4f9|1573371874; Version=1; Expires=Mon, 09-Nov-2020 07:44:38 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1573371874.4|kimWiymOgu.fcgqsLn0oagi; Version=1; Expires=Mon, 25-Nov-2019 07:44:38 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.167.1
p3p
CP="CUR ADM OUR NOR STA NID"
date
Sun, 10 Nov 2019 07:44:38 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 A577
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/78.0.3904.70 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
KTPCACOOKIE=YES; KADUSERCOOKIE=5343EEEB-D1B7-486A-A5DA-A363E4ACF543
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 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=129669
Expires
Mon, 11 Nov 2019 19:45:47 GMT
Date
Sun, 10 Nov 2019 07:44:38 GMT
Connection
keep-alive
Vary
Accept-Encoding
data
lb95.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb95.s400.meetrics.net/data?/jD1sGJOBALl1FDLkqFK0kyByyAw0Az0A62A35A2wAw6AwyFl0FptFlBF2qoFx1A3zAz3Ax4A3zA42A50ApoFq5BtlFysFuBFUkzFnBZBAAOA55A55A85B55A58E55A55AGAx1A3wA15ArbosAP+AAAAAkaAPhRjAPAAAAAAkaAIhRjAPAAAJPAWEAHbosAPPDAAZAwSAcAAAARksFAQtjF20pTSA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.15 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h217.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 10-Nov-19 07:44:38 GMT
data
b63.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://b63.s79.research.de.com/data?/wkgsFMOBALl1FDK2mFLkqFK+kyBoyyAw0Az0A62A35A2wAw6AwyFl0FptFl6BwhFnlFfpFtwFylFzzFpvFufFpkF2qoFx1A3zAz3Ax4A3zA42A50ApoFq5BtlFysFuBFTkzFPPcBAAZAwSAcAAAARksFAQtjFlf7QSA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
78.46.46.82 Nuremberg, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h370.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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 10-Nov-19 07:44:38 GMT
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=df95007b-20b7-f7eb-5b61-3032a9ef8474&tv={c:tyiB7W,pingTime:5,time:5032,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:5032,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[5027~100],as:[5027~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:175,fm:rHpa2Q8+11|12|1311|1312|1313|14|151|16|17|18|1911|1a|1b|1c|1d|1e*.346702-39754020|1f|1g,idMap:1e*,rend:0,renddet:WINDOW,rmeas:0}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:40 GMT
X-Server-Name
dt38.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1573371884170&__it=-60&__ic=727391&__iq=c9043f73cb045f34fee88b602615d4fd&__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/78.0.3904.70 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 10 Nov 2019 07:44:44 GMT
Last-Modified
Mon, 02 Nov 2009 07:42:56 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, 04 Nov 2012 07:42:56 GMT
perf
trc.taboola.com/stroeer-smb-giga/log/3/
0
275 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/perf?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191106-19-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/78.0.3904.70 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
10
date
Sun, 10 Nov 2019 07:44:44 GMT
via
1.1 varnish
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"
status
204
x-served-by
cache-fra19166-FRA
pragma
no-cache
server
nginx
x-timer
S1573371884.402281,VS0,VE10
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0

Verdicts & Comments Add Verdict or Comment

213 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 string| cookieName function| getCookie function| setCookie 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 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 boolean| smbt_only object| DKUIM_SETTINGS object| is number| LUX_t_start number| LUX_t_end object| gaLog string| szmvars object| iom object| smbVideoService string| lazyLoadAmdUrl string| polyfillAmdUrl object| dependencies object| _absconfig object| iam_data object| pagespeed object| adsbygoogle object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| dataLayer string| type function| sdibgclick 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 boolean| _gfp_a_ object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad boolean| _gfp_p_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars function| _extends function| _typeof function| setImmediate function| clearImmediate boolean| apstagLOADED object| google_tag_manager object| nativendo_588f272a3e49c_conf object| _econa function| send object| google_optimize function| _ 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| _taboola object| closure_memoize_cache_ object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| core function| pbjsYLHHChunk object| stroeerCore object| de_meetrics object| TRC object| _tblConsole undefined| msg object| _comscore function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| webpackJsonpdkuim object| Base64 boolean| dkuimInited boolean| google_noFetch function| $ function| jQuery function| isEmpty object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad object| _m6rq function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet string| preloadType object| confiant 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 function| udm_ object| ns_p object| COMSCORE number| _m6rApiLoaded object| nativendo_588f272a3e49c_map object| _m6rOnce number| _m6rContainerLoaded object| google_image_requests object| BrandBoosterLoader object| trcManager object| trcRbox object| options number| mtrcs_pid function| mtrcs_callReadJavascript object| containers object| images string| sdm_ift function| stroeerCoreConnect object| cp2 object| Adform function| _h object| _adexc object| adex object| pbstck object| ibb_lib object| _EQLService object| _EQPScript string| apsrc object| audienceProjectLayer object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr

31 Cookies

Domain/Path Name / Value
.openx.net/ Name: pd
Value: v2|1573371874|mOkimWiygu
.openx.net/ Name: i
Value: c9dc6cd2-296d-072a-03d5-6ac9adfdd4f9|1573371874
.adscale.de/ Name: ng
Value: 2#1289039436#26222864#0#d7~1&d10~1&d2~2&d4~0&d11~0&d8~2&d9~3&d12~3&d1~1&d3~3
.adscale.de/ Name: uu
Value: 3026ae73ab3849ef9e2fed8eeb3aaffe
.amazon-adsystem.com/ Name: ad-id
Value: A1mizAssAEdalCH_WsTVDdM
.agkn.com/ Name: ab
Value: 0001%3Awrhmv6Jwb7EA2WPEZeGnhP8H5BgbDU2KHcXJu2ftvkeOUVxA1lwnZg%3D%3D
.agkn.com/ Name: u
Value: C|0AEAlWnxiJVp8YgAAAAAAAg1RAQCADVIBAIA
.giga.de/ Name: ioam2018
Value: 001285e55987b23775dc7bfe2:1600242274021:1573371874021:.giga.de:2:giga:software_content:noevent:1573371874021:akas42
.doubleclick.net/ Name: DSID
Value: NO_DATA
.giga.de/ Name: _gid
Value: GA1.2.634750232.1573371874
.doubleclick.net/ Name: IDE
Value: AHWqTUljsMukHzpHch-SoedIlDn8JfN5Oj2bpC_-bw-w-m8KcAuL-1HFEMm95wz2
.ih.adscale.de/ Name: tu
Value: 4#2926306177#48~d15aed7237d248b60bed57f124711de3~437047~0~0#101~~437047~437047~1#38~CAESEIoOLcnlVuw7q6xJefskiGI~437047~0~0#39~76a45dc7-b622-4f00-8757-0a5bf245e439~437047~0~0#40~20402f25-cedb-4932-9ae5-37c056c70d28~437047~0~0#72~6757580747580766349~437047~0~0#42~99643324124625111~437047~0~0#75~~437047~437047~1#63~Xce-4rlQJsMAADAaMXAAAAB9&1197~437047~0~0
.m6r.eu/ Name: yieldlab
Value: 2019-11-10T07%3A44%3A35.176Z
.m6r.eu/ Name: adscale
Value: 2019-11-10T07%3A44%3A34.205Z
.amazon-adsystem.com/ Name: ad-privacy
Value: 0
.m6r.eu/ Name: appnexus
Value: 2019-11-10T07%3A44%3A34.176Z
www.giga.de/ Name: smbVideoStickyAutoplay-GIGA
Value: 19
www.giga.de/ Name: AWSELB
Value: E3417B491473CBC1A013199F961D4B7989B16A0E783847BDDA9E5ECC978319D414C32B66988E458DA879EC40A407D1E05EAF40ABC8761A8AE6799BE3D20BC278875F56D97F
.giga.de/ Name: __gads
Value: ID=5da02f39e0589334:T=1573371874:S=ALNI_MYajz4lFs3UtUOg5alEBjtyQG5hog
.giga.de/ Name: _gat_gt1
Value: 1
.m6r.eu/ Name: adx
Value: 2019-11-10T07%3A44%3A34.223Z
www.giga.de/ Name: trc_cookie_storage
Value: stroeer-smb-giga%253Asession-data%3Dv2_d9db48da95d25950d434a47fd312a41b_83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562_1573371874_1573371874_CNawjgYQrMVBGJyalqLlLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA%7Ctaboola%2520global%253Alocal-storage-keys%3D%255B%2522stroeer-smb-giga%253Asession-data%2522%252C%2522taboola%2520global%253Alspb%2522%252C%2522taboola%2520global%253Auser-id%2522%255D%7Ctaboola%2520global%253Alspb%3DCwsIQhDwnTwMCwiJARDwnTwMCwhMEPCdPAwLCI4BEPCdPAwLCJEBEPCdPAwLCCAQ8J08DAsIJBDwnTwMCwhkEPCdPAwLCCcQ8J08DAsILRDwnTwMCwg7EPCdPAwLCD0QkM87DAsIPxDwnTwMDBMU%7Ctaboola%2520global%253Auser-id%3D83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562
www.giga.de/ Name: _econa
Value: c9043f73cb045f34fee88b602615d4fd
www.giga.de/ Name: lux_uid
Value: 157337187401177870
.m6r.eu/ Name: test
Value: true
www.giga.de/ Name: POPUPCHECK
Value: 1573458274022
.giga.de/ Name: _ga
Value: GA1.2.1630675580.1573371874
.m6r.eu/ Name: id
Value: d15aed7237d248b60bed57f124711de3
www.giga.de/ Name: smb-session
Value: direct-1-default
www.giga.de/ Name: session_id
Value: 3d956d1c-3091-403d-8454-c06661dbd527
www.giga.de/ Name: variantATest
Value: 0

4 Console Messages

Source Level URL
Text
console-api log URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
starting version 20181002
console-api debug URL: https://static.adsafeprotected.com/sca.17.4.95.js(Line 32)
Message:
a: 0.0009765625ms
console-api info URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
got title from meta
console-api error (Line 1)
Message:
Pubstack.io // [object Object]

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.

aa.agkn.com
aax-eu.amazon-adsystem.com
ad.yieldlab.net
ads.pubmatic.com
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
ajax.googleapis.com
api.theadex.com
api.yieldlove-ad-serving.net
as-sec.casalemedia.com
b63.s79.research.de.com
bbcdn-bbnaut.ibillboard.com
bh.contextweb.com
boot.pubstack.io
bttrack.com
c.amazon-adsystem.com
c.nativendo.de
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.emetriq.de
cdn.exactag.com
cdn.m6r.eu
cdn.prod.pubstack.io
cdn.speedcurve.com
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cds.taboola.com
cm.g.doubleclick.net
confiant-integrations.global.ssl.fastly.net
d.agkn.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
dt.adsafeprotected.com
eu-u.openx.net
ff.doubleclick.net
files.giga-video.de
fw.adsafeprotected.com
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
intake.prod.pubstack.io
irqs.ioam.de
js.adscale.de
js.agkn.com
js.stroeermediabrands.de
lb95.s400.meetrics.net
m.exactag.com
match.adsrvr.org
match.taboola.com
maxcdn.bootstrapcdn.com
native.adscale.de
nugmw.userreport.com
odr.mookie1.com
pagead2.googlesyndication.com
pixel.consentric.de
pixel.rubiconproject.com
prg.smartadserver.com
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
px.powerlinks.com
rtb.mfadsrvr.com
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
s79.mxcdn.net
s79.research.de.com
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
ssl.3.damoh.giga.de
static.adsafeprotected.com
static.giga.de
sync.mathtag.com
t.nativendo.de
tpc.googlesyndication.com
track.adform.net
tracking.m6r.eu
trc.taboola.com
ups.xplosion.de
uss.xplosion.de
videos.giga.de
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
100.20.21.65
104.109.82.87
104.244.36.20
107.178.241.34
109.71.25.30
13.224.196.125
13.224.196.46
130.211.13.252
136.243.4.15
143.204.101.24
143.204.90.242
148.251.51.163
151.101.113.194
151.101.114.217
151.101.114.49
151.101.12.166
151.101.14.2
161.156.66.178
172.217.22.98
172.217.23.98
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
18.185.154.43
18.195.39.206
184.30.220.71
185.29.133.208
185.33.223.83
185.59.220.19
185.64.189.112
185.86.139.58
188.40.16.106
188.40.45.203
192.132.33.46
193.46.63.75
199.166.0.24
199.166.0.32
2.16.122.151
2.18.233.180
2.18.233.67
2.18.234.21
2.18.234.72
2.19.43.224
2001:4de0:ac19::1:b:3b
213.202.235.9
2600:9000:2156:1000:12:6213:9cc0:93a1
2600:9000:2156:c600:15:efbc:e300:93a1
2600:9000:21f3:5e00:1f:a1b:34c0:93a1
2600:9000:21f3:d400:1c:8c89:a300:93a1
2606:4700:20::6819:ac0d
2a00:1450:4001:808::2001
2a00:1450:4001:81b::200e
2a00:1450:4001:81d::2002
2a00:1450:4001:81d::200a
2a00:1450:4001:81e::2002
2a00:1450:4001:81e::2006
2a00:1450:4001:820::200a
2a00:1450:4001:825::2002
2a02:26f0:6c00:2bc::5f76
2a03:2880:f11c:8183:face:b00c:0:25de
34.248.95.73
34.95.120.147
34.95.76.218
34.98.67.61
35.186.238.175
37.157.6.245
40.113.136.100
46.253.113.178
46.4.116.20
52.214.103.10
52.219.72.195
52.28.175.104
52.28.238.200
52.29.12.192
52.29.86.7
52.48.102.50
52.58.36.240
52.94.216.48
54.171.34.13
54.77.22.22
62.138.221.190
62.168.44.118
63.34.92.224
69.173.144.165
78.46.46.82
89.163.159.108
89.163.159.109
89.163.159.121
91.215.100.39
91.215.100.40
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
014a785cbc3e96e7389a2d9019142a58b6e5a9ee699764eb3123113cdd8ad81a
032d5b3efafad42cdec53e7650f403dac14f79e24bf8e08bcc80a44508c584ae
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
149c8d10677f2f6979fa28c078cf832f575ee53c397d791b739e7c4c687fe7bc
1662d322e37cf13dc213b2ea4f5ec1ddb3052f91010b9fbe96283dcc4de46465
1913b934223d7e3778e936702f58e12a08e0ef0dc8a81d991f3e1779baa6b570
1b52790c10dd5e76563e9dba76055d950648bb19ae249fbf1f15143618c06db9
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f
1cb32f69d6c95c0a152ca35ffac4daeabda8f30ec6ed5ae2821dc29e4982184d
1d578dc3367ffc480f6c230a912f72e3906d4438b5daaf1c319fd3b7a006cd3d
1f38478b51d02ae82c2545731c6b66319a99178124f54879533e0a3c832aa0a1
27985c092be25c3437bc2f6af2667ef7f041ce809fe0581d9d3aea8c3b01ea07
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2cf2824d7273536f38f615aa482c2a6e8581dee8b688d46c938f6dd987ed91ce
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
2f2a0b01f66a476f1d93b87aba36ff27b0290bd7b654d19c2e4d29a4ec2e91d6
2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
413364272994992257eb29f54a63fd828220d3217d8cf955e57f4edb3a4e3402
4206f29e9bd4eebc2ab50230ef824e1b344bdf2e467a84ff2be6aff62ca850dc
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630
482f2b0598b74a958dab3739a19d787ae1d100f7a60cd3949942ed81d9350195
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4bb47fa38ca7745888b1b6001b319721e197974d981789d595c08325e451a1f7
4f3ec1226d44f2dbb1d6957395f1271c0717206886219d051228e69dff10513c
5075b0d31c00903c1a8f437e6e356da4ebf9fe7066ac6809427d184b55fc382c
51fbe136f28f60bc09b2a92ec09f109e560fb76b14d564e46fbd39cc6020f425
531a66d87c003af79326c86806b3645dca4f8b7d2a1eb73e07b57b55300357c7
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
56a110fa4752f768e35dbf197411e19faebf4c8eb59ee8545cc019dc61a1f0be
5ac6d3e00b64557c7e6f13c701d72b95236b82576421f5ee2f01e1b9855a3050
5b750985d245681e7b816c1c69da434ead04cacadd0adc6746c080f8af1275cd
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
603b80da5576a7fd6baa46e63201e4d23d7408ecd9f9a6c80380a49d4c25b27a
60e578406dfc9c739c3864f8b20b1235d6be2d3b3f41f50423ff06b839c25e11
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
66557b1fd9e362afdfa527946d2f7702a2edd34c87797cfd6dfe2d9916d2af6b
6753fe21faadf756564a95e3e6e6af88417c1d46bcdaed411cb8e606fe53f7e8
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268
6a1d3602e9d7b62d01c879633c85e5967b296c3baca64dc540ce65e9909ec80d
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6d73fde54289be2db5f96225f622a9729557351aa068fc8318071a0083583b77
6eeedc8575b2952c7a1825a1f3dc4790b618a579ac5c79157cbf29d5b1e1d7b2
6fdb632948703d1c6024ead3004a41c869c85a572e4a10eea092fb8af4e0353f
70072788613bde80533a3cb95d5a16c924011004b1d861093610379370beb859
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847
73419ec87d237765f7eb660f382f3d3c04940c984ad03317084a9e75e3036cb9
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
765c79d7db932953b7c4c409e04a582a7b9f0cad3ebdfee6d5cf3dc5bbb8d1eb
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
7cbbb86e34178982a12c3c1caeb5c1c073748bfbe606151e7d7e69e41705bfb0
7ee70a05b47281121926595010ff4b2a0646ed0cba9f08cba98cd4b834734592
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
86927cafa657ae14a28bdca63befb837251fc4ce67683aa19fdccf4d1bfeef3b
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
8794def5656f38c34fe46816da7926a308c41f55306a290f298a2400feae1178
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
89b7e20cf73c5d61af4ae659c63f2eab235dd32a1dce673b5e6c3d47be59d6ef
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8b82f283e3f518b44dd6050d8dfca59cb318704bed72073384be1140d9a9599d
8e82af12eb1ae5cde2f667f9b8542354d8b7ad194664bec310f02a6f760785e2
8e851426fdd64dbee15e3f999b9b528b45c1ada813496ec03c62f279aaf426c9
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
9cc497bc619324d17e01cd772c713cb796aeb0cd31a200a674dee1a96aab9d8d
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
aa03dc59bdca72631d2301e4297cfa030bd31b907dc138e7b973d12311c90a22
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
aef31448f7f21e08ff26f53e8fa6cd851021560ff282b59217920d31c9ade86a
af9e05e18a2be5ae5a15505e259ae486da5030111e991c9d1bc5060fcd938221
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b2a27a31e9d34704f0c2adae8a77ce35e0bc3c352a40a682d89783142780c2f7
b6b69022dbeedf8b91a3a3ea6946be8114306c0042606cae67bea0ef28404f1f
b71ee50d2aefd4b9241ffd0a8a229552e4269cdb8ad05a4a097c8c72c3cdd05b
bdeed1e1c0751610c8f3dc2a5c78c93f841c366b36a7f7a54f5e6752c2656c05
beeb183690bc39bcaac010f4b4b8fec2c573c525522e73afc19bf3afcd35e015
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c5ce02d4faa9333de3e11f24c4cb2f335edb64ff6c0e9174365e8a34c550e75b
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d0fd74148f4cbe78bd0e6328dc5ce5955f0a0ecdb1eb2919da4a7e596ac65912
d25307552c3d68bb4f0ac3bb468ab6f77e3755f64d6a0bb49ac9409dd3c3298b
d4b7507a7cee314407aca61e663b9a995162d6ab7418407789755c591647341b
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
dce09f5e55feb176dedd208a98b683f1686217e55f0bf701465270347d24c634
dd0ed2aa79b978b0c5e0cf9cdedcd3271deadfdd80a7f1cf4f53ed27be199a03
dd28ac8237e60211a798ccc9ecacec2accc1fd02ee06f6264a3624606cd38831
dd93b211db8ea6b337dd62aca09a1634d67878f5347ffe5d525da708e020f70c
e140d6344f8b0353f7cab1b3a16c4c30a735fb43e6575616e8c2ef7a896bf963
e29eb387f23907cbe6355d4dda4c204e494a74be0b12adf422490b11e2568f36
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e48f08b200b1d8a4054305847126d87a19219dfb882be603e9c3b30f4062a6bc
e4ab34b8a905b1076f36fddd2dc1e2dacd9c1bbca6614ab260e9b40aa0dced41
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f6b9ce87b489624061f59fc26b2a1e7ef25238fac783c04df7c5e7e36cdbaf27
f7e0a93c8b665fd0fd4632e1d87f61c0e441a6f477f1647332b78301ed9370b6
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
fc2c078ff7dbfc4334dc543b2fb93107671a69ebdeee982e1f8b866e252ea322