URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Submission Tags: phishing malicious Search All
Submission: On February 28 via api from US

Summary

This website contacted 71 IPs in 10 countries across 66 domains to perform 235 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
14 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.103.64 43407 (INFONLINE-AS)
3 188.40.16.106 24940 (HETZNER-AS)
2 178.19.70.100 29551 (HGCOMP-ASN)
10 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 161.156.66.178 36351 (SOFTLAYER)
2 2a03:2880:f12... 32934 (FACEBOOK)
9 2a00:1450:400... 15169 (GOOGLE)
3 143.204.90.242 16509 (AMAZON-02)
1 2 2.19.33.59 20940 (AKAMAI-ASN1)
7 18 23.37.42.216 16625 (AKAMAI-AS)
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)
4 107.178.241.34 15169 (GOOGLE)
4 178.19.72.20 29551 (HGCOMP-ASN)
1 22 151.101.114.2 54113 (FASTLY)
3 2a02:2638:1::3 44788 (ASN-CRITE...)
1 20 216.58.206.2 15169 (GOOGLE)
1 143.204.101.106 16509 (AMAZON-02)
1 23.210.248.245 16625 (AKAMAI-AS)
1 1 2600:9000:215... 16509 (AMAZON-02)
1 2600:9000:20e... 16509 (AMAZON-02)
2 2a02:26f0:eb:... 20940 (AKAMAI-ASN1)
1 18.194.129.32 16509 (AMAZON-02)
1 178.19.65.130 29551 (HGCOMP-ASN)
18 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
2 2606:4700:20:... 13335 (CLOUDFLAR...)
1 2a00:1450:400... 15169 (GOOGLE)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
1 3 23.43.115.95 20940 (AKAMAI-ASN1)
2 52.219.73.48 16509 (AMAZON-02)
3 13.225.73.19 16509 (AMAZON-02)
1 2 52.95.123.41 16509 (AMAZON-02)
6 52.28.163.206 16509 (AMAZON-02)
2 2.16.122.151 20940 (AKAMAI-ASN1)
2 104.16.190.66 13335 (CLOUDFLAR...)
5 7 52.57.195.246 16509 (AMAZON-02)
3 185.33.223.209 29990 (ASN-APPNEX)
3 3 172.217.23.130 15169 (GOOGLE)
12 2a00:1450:400... 15169 (GOOGLE)
2 151.101.113.194 54113 (FASTLY)
1 151.101.114.49 54113 (FASTLY)
1 1 35.201.85.158 15169 (GOOGLE)
2 2 18.195.104.209 16509 (AMAZON-02)
1 3 151.101.14.49 54113 (FASTLY)
1 69.173.144.138 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
2 2 185.29.135.233 30419 (MEDIAMATH...)
1 1 74.214.194.140 59940 (PULSEPOIN...)
2 2 185.184.8.30 204995 (RTB-HOUSE...)
2 2 52.208.216.178 16509 (AMAZON-02)
1 1 35.162.160.88 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 141.226.224.32 200478 (TABOOLA-AS)
3 3 18.194.124.153 16509 (AMAZON-02)
1 1 193.0.160.129 54312 (ROCKETFUEL)
6 52.57.208.4 16509 (AMAZON-02)
1 151.101.14.2 54113 (FASTLY)
3 148.251.51.163 24940 (HETZNER-AS)
3 136.243.4.15 24940 (HETZNER-AS)
1 23.210.249.92 16625 (AKAMAI-AS)
1 2 34.95.120.147 15169 (GOOGLE)
1 37.157.4.25 198622 (ADFORM)
1 52.49.69.125 16509 (AMAZON-02)
1 2 89.163.159.117 24961 (MYLOC-AS)
1 194.213.222.29 5588 (GTSCE GTS...)
2 54.171.36.151 16509 (AMAZON-02)
1 2600:9000:21f... 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 2620:1ec:bdf::10 8068 (MICROSOFT...)
1 13.224.194.102 16509 (AMAZON-02)
1 2600:9000:21f... 16509 (AMAZON-02)
1 2600:9000:20e... 16509 (AMAZON-02)
1 54.154.128.203 16509 (AMAZON-02)
2 54.246.164.155 16509 (AMAZON-02)
4 52.30.80.108 16509 (AMAZON-02)
1 34.252.24.237 16509 (AMAZON-02)
235 71
Apex Domain
Subdomains
Transfer
27 taboola.com
cdn.taboola.com
trc.taboola.com
15.taboola.com
match.taboola.com
cds.taboola.com
vidstat.taboola.com
imprammp.taboola.com
236 KB
26 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
cm.g.doubleclick.net
391 KB
24 giga.de
www.giga.de
static.giga.de
videos.giga.de
ssl.1.damoh.giga.de
458 KB
22 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
148 KB
19 m6r.eu
cdn.m6r.eu
tracking.m6r.eu
12 KB
12 yieldlove-ad-serving.net
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
2 KB
10 googletagservices.com
www.googletagservices.com
234 KB
9 google-analytics.com
www.google-analytics.com
19 KB
8 adscale.de
ih.adscale.de
js.adscale.de
8 KB
6 pubstack.io
boot.pubstack.io
acdn.prod.pubstack.io
intake.prod.pubstack.io
20 KB
6 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
22 KB
5 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
29 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 google.de
adservice.google.de
851 B
4 giga-abs.de
go.giga-abs.de
2 KB
4 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
13 KB
4 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
96 KB
3 meetrics.net
lb95.s400.meetrics.net
907 B
3 bidswitch.net
x.bidswitch.net
1 KB
3 adnxs.com
ib.adnxs.com
2 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
62 KB
3 scorecardresearch.com
sb.scorecardresearch.com
2 KB
3 criteo.net
static.criteo.net
30 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
849 B
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 theadex.com
dmp.theadex.com
xpl.theadex.com
14 KB
2 adsrvr.org
match.adsrvr.org
916 B
2 creativecdn.com
creativecdn.com
ams.creativecdn.com
763 B
2 mathtag.com
sync.mathtag.com
1 KB
2 mfadsrvr.com
rtb.mfadsrvr.com
1 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
21 KB
2 districtm.io
dmx.districtm.io
cdn.districtm.io
460 B
2 yieldlab.net
ad.yieldlab.net
1 KB
2 openx.net
yieldlove-d.openx.net Failed
u.openx.net
277 B
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 googleapis.com
ajax.googleapis.com
imasdk.googleapis.com
120 KB
2 userreport.com
nugmw.userreport.com
sak.userreport.com
22 KB
2 facebook.com
www.facebook.com
496 B
2 vgwort.de
ssl-econa.met.vgwort.de
777 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
581 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
316 B
1 rfihub.com
p.rfihub.com
744 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
430 B
1 contextweb.com
bh.contextweb.com
474 B
1 powerlinks.com
px.powerlinks.com
402 B
1 rubiconproject.com
pixel.rubiconproject.com
239 B
1 zorosrv.com
match.zorosrv.com
292 B
1 exposebox.com
server.exposebox.com
412 B
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
344 B
1 adform.net
adx.adform.net Failed
track.adform.net
494 B
1 pubmatic.com
hbopenbid.pubmatic.com Failed
ads.pubmatic.com
1 giga-video.de
files.giga-video.de
15 KB
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 google.com
adservice.google.com
171 B
1 dkuim.de
dkuim.de
151 KB
1 dunkirkinception.com
www.dunkirkinception.com
490 B
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
3 KB
1 nuggad.net
si.nuggad.net
599 B
1 mxcdn.net
s400.mxcdn.net
49 KB
1 yieldlove.com
cdn-a.yieldlove.com
89 KB
1 gstatic.com
www.gstatic.com
174 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
0 smartadserver.com Failed
prg.smartadserver.com Failed
0 otto.de Failed
orbidder.otto.de Failed
235 66
Domain Requested by
20 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.googletagservices.com
www.giga.de
18 tracking.m6r.eu 7 redirects www.giga.de
tracking.m6r.eu
15 trc.taboola.com 1 redirects cdn.taboola.com
www.giga.de
14 www.giga.de www.giga.de
12 tpc.googlesyndication.com securepubads.g.doubleclick.net
tpc.googlesyndication.com
10 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
10 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
9 www.google-analytics.com www.giga.de
7 ih.adscale.de 5 redirects www.giga.de
js.adscale.de
7 cdn.taboola.com www.giga.de
cdn.taboola.com
6 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
6 prod-ingestion.tracking.v2.yieldlove-ad-serving.net cdn-a.yieldlove.com
6 videos.giga.de www.giga.de
videos.giga.de
text
4 intake.prod.pubstack.io www.giga.de
4 adservice.google.de pagead2.googlesyndication.com
www.googletagservices.com
4 go.giga-abs.de www.giga.de
3 lb95.s400.meetrics.net www.giga.de
3 ssl.1.damoh.giga.de text
3 x.bidswitch.net 3 redirects
3 cm.g.doubleclick.net 3 redirects
3 ib.adnxs.com www.giga.de
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 sb.scorecardresearch.com 1 redirects cdn.taboola.com
www.giga.de
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 static.criteo.net www.giga.de
3 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 uss.xplosion.de www.giga.de
2 ups.xplosion.de js.stroeermediabrands.de
cdn.emetriq.de
2 u.openx.net 1 redirects cdn-a.yieldlove.com
2 t.nativendo.de c.nativendo.de
2 match.adsrvr.org 2 redirects
2 sync.mathtag.com 2 redirects
2 rtb.mfadsrvr.com 2 redirects
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 ad.yieldlab.net cdn-a.yieldlove.com
www.giga.de
2 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 c.nativendo.de d.nativendo.de
c.nativendo.de
2 d.nativendo.de www.giga.de
c.nativendo.de
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 adstax-match.adrtx.net cdn.adrtx.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.giga.de
1 d.agkn.com js.agkn.com
1 cdn.emetriq.de ups.xplosion.de
1 sak.userreport.com nugmw.userreport.com
1 acdn.prod.pubstack.io boot.pubstack.io
1 de-gmtdmp.mookie1.com
1 js.agkn.com js.stroeermediabrands.de
1 bbcdn-bbnaut.ibillboard.com js.stroeermediabrands.de
1 dmp.theadex.com js.stroeermediabrands.de
1 js.adscale.de js.stroeermediabrands.de
1 boot.pubstack.io js.stroeermediabrands.de
1 track.adform.net js.stroeermediabrands.de
1 ads.pubmatic.com cdn-a.yieldlove.com
1 cdn.districtm.io cdn-a.yieldlove.com
1 imprammp.taboola.com www.giga.de
1 vidstat.taboola.com cdn.taboola.com
1 p.rfihub.com 1 redirects
1 cds.taboola.com www.giga.de
1 bttrack.com www.giga.de
1 www.storygize.net 1 redirects
1 ams.creativecdn.com 1 redirects
1 creativecdn.com 1 redirects
1 bh.contextweb.com 1 redirects
1 px.powerlinks.com 1 redirects
1 pixel.rubiconproject.com www.giga.de
1 match.zorosrv.com www.giga.de
1 match.taboola.com 1 redirects
1 server.exposebox.com 1 redirects
1 15.taboola.com cdn.taboola.com
1 cdn.stroeerdigitalmedia.de www.giga.de
1 dmx.districtm.io cdn-a.yieldlove.com
www.giga.de
1 files.giga-video.de www.giga.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 imasdk.googleapis.com videos.giga.de
1 ajax.googleapis.com www.giga.de
1 adservice.google.com pagead2.googlesyndication.com
1 dkuim.de www.giga.de
1 www.dunkirkinception.com www.giga.de
1 cdn.stroeerdigitalgroup.de js.stroeermediabrands.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 cdn.m6r.eu 1 redirects
1 www.gstatic.com www.giga.de
1 static.giga.de www.giga.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
1 js.stroeermediabrands.de www.giga.de
0 yieldlove-d.openx.net Failed cdn-a.yieldlove.com
0 adx.adform.net Failed cdn-a.yieldlove.com
0 prg.smartadserver.com Failed cdn-a.yieldlove.com
0 hbopenbid.pubmatic.com Failed cdn-a.yieldlove.com
0 orbidder.otto.de Failed cdn-a.yieldlove.com
235 100
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
2020-02-20 -
2020-09-10
7 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
2020-02-12 -
2020-05-06
3 months crt.sh
*.google.com
GTS CA 1O1
2020-02-12 -
2020-05-06
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
2020-01-16 -
2020-04-15
3 months crt.sh
*.google-analytics.com
GTS CA 1O1
2020-02-12 -
2020-05-06
3 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
a year crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
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
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2020-02-14 -
2020-07-25
5 months crt.sh
*.criteo.net
DigiCert ECC Secure Server CA
2019-12-03 -
2021-04-06
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
cdn.stroeerdigitalgroup.de
DigiCert Secure Site ECC CA-1
2020-02-13 -
2021-04-13
a year crt.sh
www.dunkirkinception.com
Amazon
2019-05-22 -
2020-06-22
a year crt.sh
*.dkuim.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-03
2 years crt.sh
*.storage.googleapis.com
GTS CA 1O1
2020-02-12 -
2020-05-06
3 months crt.sh
sni.cloudflaressl.com
CloudFlare Inc ECC CA-2
2019-11-17 -
2020-10-09
a year crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh
*.scorecardresearch.com
Sectigo RSA Organization Validation Secure Server CA
2019-12-16 -
2020-12-25
a year crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2019-11-15 -
2022-02-13
2 years crt.sh
*.s3.eu-central-1.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-11-09 -
2020-12-10
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
aax-eu.amazon-adsystem.com
Amazon
2019-09-18 -
2020-08-26
a year crt.sh
*.tracking.v2.yieldlove-ad-serving.net
Amazon
2019-11-25 -
2020-12-25
a year crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2020-02-04 -
2021-05-05
a year crt.sh
districtm.io
CloudFlare Inc ECC CA-2
2020-02-25 -
2020-10-09
7 months crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2020-02-12 -
2020-05-06
3 months crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-12-18 -
2020-12-18
a year crt.sh
g2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-11-21 -
2020-11-12
a year crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.bttrack.com
Sectigo RSA Domain Validation Secure Server CA
2019-03-19 -
2021-04-13
2 years crt.sh
*.taboola.com
DigiCert ECC Secure Server CA
2019-09-03 -
2020-09-10
a year crt.sh
yieldlove-ad-serving.net
Amazon
2019-11-19 -
2020-12-19
a year crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2020-02-27 -
2020-05-27
3 months crt.sh
meetrics.net
Let's Encrypt Authority X3
2020-02-24 -
2020-05-24
3 months crt.sh
*.adscale.de
Amazon
2019-07-03 -
2020-08-03
a year crt.sh
*.pubmatic.com
DigiCert SHA2 Secure Server CA
2020-02-26 -
2021-05-27
a year crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years 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
2020-01-08 -
2021-03-08
a year crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
acdn.prod.pubstack.io
DigiCert SHA2 Secure Server CA
2019-11-28 -
2020-11-28
a year crt.sh
*.emetriq.de
RapidSSL RSA CA 2018
2020-02-13 -
2022-04-13
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 26 frames:

Primary Page: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Frame ID: 48984D4D9FCA2DF9FA29D00C8F16A88C
Requests: 146 HTTP requests in this frame

Frame: https://videos.giga.de/embed/2006343101
Frame ID: E10D3E5370E906274594C851508238DE
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: BB112AA2DDB516AB45EC18967EA2F069
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20200224/r20190131/zrt_lookup.html
Frame ID: 2FD3353F7CCB07A47B5468772688A4CF
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=1582885279&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&flash=0&wgl=1&adsid=NT&dt=1582885279576&bpp=15&bdt=294&fdt=98&idt=99&shv=r20200224&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=2586042179640&frm=20&pv=2&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&ga_fc=0&iag=0&icsg=13210380126914&dssz=66&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=490&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064523%2C21065304&oid=3&pvsid=15305690729075&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=J8Jn6JkB7B&p=https%3A//www.giga.de&dtd=133
Frame ID: 0842835594C516F3CB16E7260447577C
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=1582885279&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1582885279591&bpp=4&bdt=309&fdt=167&idt=167&shv=r20200224&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=2586042179640&frm=20&pv=1&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&ga_fc=0&iag=0&icsg=52841520507662&dssz=68&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=21064523%2C21065304&oid=3&pvsid=15305690729075&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=171
Frame ID: ADD724A930E537D3F7BBB8249CDD4010
Requests: 1 HTTP requests in this frame

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

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

Frame: https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_iro3u47
Frame ID: 7D4257B58906D808CDA792EF7CD25A64
Requests: 15 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20200224/r20110914/elements/html/impression/delayed_impression_vu_fy2019.js
Frame ID: FEB0F9B1F79C794F981E751EFA7EF07C
Requests: 15 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsu7cJSnTHSK-0J2f8XrK8fzoMwTv3I8OMFMXxjtj5AR7ZnPFG6c-NJQMC2BzxCqEiuxzOQk1gso4Y1ePcJd2Jommu_vAVbksMrFWstz0jxzOgohzqY2W88jEQ4NiuImmD_I4M9lrZYAXJWwERewmOZOon9Ie6dcNFpWf00FYGrkyyd-VB_48UwWbvCDPEQ4Al7AO-tp0aILbnYaRzwnI5MiZ9BmgbdwwuVsZCGJBhcFtCZ6ZZgBk4hx1d73WgL96ITtgxDrQPW_0BTMrful8g&sig=Cg0ArKJSzBRj68wpLOZyEAE&urlfix=1&adurl=
Frame ID: CF7DDD620FBCD6C1AEA89D148256943D
Requests: 14 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssOBETn54f_L3QudGFNPCDu_8nwpL5LpbUPBmqnZ4bZRiJz9WuYFA8uWLmJX5JGN8nO2apGUzqwE05RAXC3PiHRxjh-ilpj11kyDXH7hr8DPizgzcIOAt5curuhyp_U5QfpGLdEOOm1sjkYaM1tJXPiZwcX790PEK0JJwASKmxKrIt8xBC2FG1_pfMVVtpMpgfibJmTPODSbsQ6UJhXVH3u36cDSwiqxmDJRvCt4XzYQFArAMHiUJDsjbtMNRvlFNbIXqsSUrmBZNi_zFaP9w&sig=Cg0ArKJSzLSLVUZN7tm6EAE&urlfix=1&adurl=
Frame ID: 3FD22888C2D2A1D55DF12A985919AA2B
Requests: 12 HTTP requests in this frame

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

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

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

Frame: https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=92479FD575238780325174637002&cicmp=1657475&cijs=1&dast=V7KB4CFgO832lxhTCIDwS832lxhTCIDwUAAAAGBvQHHTkZ7ZYzEmu3mmyGu-FgMxkthpPRaDKZLGZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3Ch6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2a1zWVwvo-Vlt7w8RrvL8tb6PaeX3a23m512l1tleTtNp5fZ7pcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYABUfC_N0Wy8tmc_kDAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENp8MagB-DBB-BBCAAA4GIo9y_JrJMxZoGoILWIEQAAAECudLbd0aROqCyqAAAI0q0ArgAAAuAWoTZTsnQHJd7CAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-akNJFYxrQpM6k2i8gAMDaLyAAAJu6AQC8CcAFXQCsziAmm9FuMjsAAACAu____389kNt4VraJx-VxThbOicm0HHk8FodlY1qtbCvjYrk9BpOrRF2Vdae-EWGZ_b6DgnJ6eswug4zlMhnUAlnT5PIbxAcNw3IyCOY3YYvRajLZLIez5WIyGI6Go9H-BG40wAkaDgeL3WCxWyyGk8VkNFgOFigQgwlOyHC0maxGu9VushxORqPZZrJBilatZqPNYLiaTWa73Wo4GC5HI6RozWI2mSxmo-VuM1hORoPhZDhEGFp5bDbfbuZWeTaOtWi5cbglrt1srZnZRh7TbDAbGTdu0etjeq0ms5ljZsWDOl0c-9qFi4IBUnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WXf23hWtonH5XFOFs6JybQceTwWh2VjWq1sK-NiuS-tPDabbzdzqzwbx1q03DjcEtduttbMbCOPaTaYjYwbt-j1Mb1Wk9nMMfM3VsPJcLia7Jb7xmo4GQ5Xk91y36EzfFefs1F50yo8Qm31Oz2eZKaDwmWweDeq1XH8mRy0ZbPRqRNZvp-N0e_3-_1-v9_v9_sNWs_BbDAoYongdJFORC_j6SKWSJ4W6US4WbgWq43DOFw4Jr6JyTZarVyL5WIw2W0cu4VlIpYoTRfpRK97WRyGw-cveDgPD7Nfc3h5nA6z5y94OA8Ps1vnsrheRsvLbnl5jHaX5a31e04vu1tvNzvtLrfK8naaTi-z3aL-40MMV3PJYjCXLHZzxWK4SgAAAAAAAAAAS5gzbwIAAABwGshiMZgslgsAIca66688yuHNPZdc3PgxxJwuf5fL8ta8LW6d0-cw82Y!&excid=22&tst=1&docw=0&cs=false
Frame ID: C0FD7548EDD62AD49EEEDCEF42DA9A3C
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Frame ID: 584D310ECC685748D3696038CEFD03C2
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Frame ID: 1809E60F41A270479BBC6077AD55677A
Requests: 1 HTTP requests in this frame

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

Frame: https://cdn.districtm.io/ids/index.html
Frame ID: AF234A5FC37CE94AF564D2FDD58DB0EB
Requests: 1 HTTP requests in this frame

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

Frame: https://u.openx.net/w/1.0/pd?cc=1
Frame ID: 3B46C545DFEC81D64827EA9700FF2307
Requests: 1 HTTP requests in this frame

Frame: https://ih.adscale.de/map?ssl=1&format=video&nut&uu=b7d849918f93436892a3bcd428b9928b
Frame ID: 1F5DFB1889FD5910D4C9883A7099BDA1
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=907326429&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22gdpr%22%3A%22%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: 1B31901DB39720C9F679960D13762EEF
Requests: 1 HTTP requests in this frame

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

Frame: https://adstax-match.adrtx.net/activation?receiverId=adaud
Frame ID: 63E273D6C1570154168BD50D049F4AA1
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

235
Requests

97 %
HTTPS

22 %
IPv6

66
Domains

100
Subdomains

71
IPs

10
Countries

2299 kB
Transfer

7121 kB
Size

0
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 12
  • https://ssl-econa.met.vgwort.de/na/c50e6523a40d4ebda6d075c30346eeff HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 16
  • https://cdn.m6r.eu/sync/api HTTP 302
  • https://tracking.m6r.eu/sync/api?checkcookies=true
Request Chain 18
  • 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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000a&i2=000a169e981933c725e58e99f&ep=1608215517&vr=416&id=sxnjyl&i3=000a169e981933c725e58e99f%3A1609582879397%3A1582885279397%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1582885279397&n1=3&dntt=0&lt=1582885279399&ev=&cs=699ujf&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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000a&i2=000a169e981933c725e58e99f&ep=1608215517&vr=416&id=sxnjyl&i3=000a169e981933c725e58e99f%3A1609582879397%3A1582885279397%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1582885279397&n1=3&dntt=0&lt=1582885279399&ev=&cs=699ujf&mo=1&sr=71
Request Chain 26
  • 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 32
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 33
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/3801ce6d-e2fc-4372-aad7-038e2babe3dd/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
Request Chain 78
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift HTTP 302
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
Request Chain 92
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=480b4494fe340ce3569442613ff79465&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D480b4494fe340ce3569442613ff79465%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 302
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=480b4494fe340ce3569442613ff79465&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D480b4494fe340ce3569442613ff79465%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__&nut&uu=450de324b08f405c9cc179e46f6379b4 HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=480b4494fe340ce3569442613ff79465&userId=adscale-user:2f15890f9c2343c8b81f527aed808cfa HTTP 302
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=480b4494fe340ce3569442613ff79465&userId=adscale-user%3A2f15890f9c2343c8b81f527aed808cfa&checkcookies=true
Request Chain 93
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=480b4494fe340ce3569442613ff79465
Request Chain 94
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=SAtElP40DONWlEJhP_eUZQ HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0 HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889%2C0&checkcookies=true
Request Chain 95
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=480b4494fe340ce3569442613ff79465
Request Chain 105
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvkK8Z6PkPq0dsINAi9TudqX4kKH79rCuQlOS33fjEHRCWj9JjurqlffMI0tB-gPT26XRt6VNhOMSVWMY-rZUmfhOzDKRzqmmqPjkZ1MTdZ5d07B0HOpVtF7kXK1KcTQG_yYvEK1Qm-5WWdcryRFA0kXugtxrh5iWuUlO-Se3rNOFa3ShqNbpMhnxA_MzdIKTyflUzjaRPnOcB1xpXdZdRoGJInvy1BtprviJdp1eIVpibun7a-zIHihTFrm_4DVvlcss5JvqjpekhPxL11pA&sig=Cg0ArKJSzJ-DXTcxwlN5EAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 111
  • https://server.exposebox.com/rcm HTTP 302
  • https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_iro3u47
Request Chain 112
  • 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=5ee839d3-b0c1-47a4-8453-9b3198c2810e HTTP 302
  • https://match.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=5ee839d3-b0c1-47a4-8453-9b3198c2810e&tbid=2a9b8f16-10bb-4096-becd-7fe54b3aaca6-tuct5526f21&query=taboola_hm%3D5ee839d3-b0c1-47a4-8453-9b3198c2810e&isDirect=0 HTTP 302
  • https://match.zorosrv.com/match?tabid=2a9b8f16-10bb-4096-becd-7fe54b3aaca6-tuct5526f21&extuid=5ee839d3-b0c1-47a4-8453-9b3198c2810e&excid=218&query=taboola_hm%3D5ee839d3-b0c1-47a4-8453-9b3198c2810e
Request Chain 114
  • 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=y08IMszXn8vpzkjb0bcKBXRYJZBnrmb2IvRTOrgXRUU%3D
Request Chain 115
  • 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://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]&mm_bnc&mm_bct&UUID=2d475e58-e9a1-4600-bb01-ec52c52646b1 HTTP 302
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=2d475e58-e9a1-4600-bb01-ec52c52646b1
Request Chain 116
  • 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=Uvcq0ihcWdZh&ev=1&pid=562107
Request Chain 117
  • https://creativecdn.com/cm-notify?pi=taboola HTTP 302
  • https://ams.creativecdn.com/cm-notify?pi=taboola&tc=1 HTTP 302
  • https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=yoRvyYLofJy14Cc1PGjj&pi=taboola&tc=1
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=CAESEDG-5oLMCvQqiESRgbM6sUc&google_cver=1
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=624c3ec4-6483-4b7f-ab4d-807a7271cd6b
Request Chain 122
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=4ecff77f-e3c1-49ca-b576-3f6dc4606d8c-tuct5526f1f HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
Request Chain 125
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola HTTP 302
  • https://p.rfihub.com/cm?in=1&pub=20513&ssp=taboola HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=119&user_id=1870471594548486892&expires=30&ssp=taboola HTTP 302
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=01311580-9501-48e7-befa-5fcce60ef212
Request Chain 202
  • https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=2&n42=1&n116=0&n104=1&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n125=0&n8=1&n2=4&n137=0&n101=1&n108=0&n54=0&n110=1&n87=1&n149=0&n76=1&n66=0&n139=0&n160=0&n107=0&n21=1&n40=1&n51=1&n117=5&n86=0&n147=4&n64=0&n119=3&n22=1&n18=1&n161=0&n126=0&n92=3&n62=1&n57=1&n77=1&n83=0&n102=0&n105=0&n159=0&n20=1&n80=1&n12=3&n141=0&n157=0&n26=1&n99=0&n128=1&n73=1&n118=3&n85=0&n9=3&n6=1&n63=1&n58=1&n138=0&n140=0&n94=2&n111=0&n136=1&n79=1&n93=2&n90=0&n142=0&n7=2&n103=1&n158=1&n124=0&n75=1&n91=0&n114=0&n69=0&n10=3&n3=1&n82=1&n33=1&n59=1&n84=1&n5=1&n109=0&n122=2&n67=2&n115=1&n89=1&n123=1&n17=1&n78=0&n81=0&n88=0&n39=1&n156=1&n148=0&n132=4&n133=1 HTTP 302
  • https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=2&n42=1&n116=0&n104=1&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n125=0&n8=1&n2=4&n137=0&n101=1&n108=0&n54=0&n110=1&n87=1&n149=0&n76=1&n66=0&n139=0&n160=0&n107=0&n21=1&n40=1&n51=1&n117=5&n86=0&n147=4&n64=0&n119=3&n22=1&n18=1&n161=0&n126=0&n92=3&n62=1&n57=1&n77=1&n83=0&n102=0&n105=0&n159=0&n20=1&n80=1&n12=3&n141=0&n157=0&n26=1&n99=0&n128=1&n73=1&n118=3&n85=0&n9=3&n6=1&n63=1&n58=1&n138=0&n140=0&n94=2&n111=0&n136=1&n79=1&n93=2&n90=0&n142=0&n7=2&n103=1&n158=1&n124=0&n75=1&n91=0&n114=0&n69=0&n10=3&n3=1&n82=1&n33=1&n59=1&n84=1&n5=1&n109=0&n122=2&n67=2&n115=1&n89=1&n123=1&n17=1&n78=0&n81=0&n88=0&n39=1&n156=1&n148=0&n132=4&n133=1&checkcookies=true
Request Chain 204
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b5f4eda2b77643c9c5113440df20e9f3&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db5f4eda2b77643c9c5113440df20e9f3%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 302
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b5f4eda2b77643c9c5113440df20e9f3&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db5f4eda2b77643c9c5113440df20e9f3%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__&nut&uu=523ad0eff17d461f9bbc2c326b3b34ed HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b5f4eda2b77643c9c5113440df20e9f3&userId=adscale-user:523ad0eff17d461f9bbc2c326b3b34ed
Request Chain 205
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=tfTtord2Q8nFETRA3yDp8w HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 209
  • https://u.openx.net/w/1.0/pd HTTP 302
  • https://u.openx.net/w/1.0/pd?cc=1
Request Chain 212
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1582885293104&ns_c=UTF-8&cv=3.5&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&c9= HTTP 302
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1582885293104&ns_c=UTF-8&cv=3.5&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&c9=
Request Chain 225
  • https://ih.adscale.de/map?ssl=1&format=video HTTP 302
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=b7d849918f93436892a3bcd428b9928b
Request Chain 231
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa3BDJ3WS7ZBsasBDUkWsfABifABSfABSfABiUABifABfrr&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=4219359112066865229

235 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
136 KB
54 KB
Document
General
Full URL
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
ee05db0b0a2b393f70b74c554238d61e8088ed96a37b3ae876bbac53b96420d2

Request headers

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

Response headers

status
200
server
nginx
content-type
text/html;charset=UTF-8
vary
Accept-Encoding
date
Fri, 28 Feb 2020 10:21:19 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
last-modified
Thu, 27 Feb 2020 15:40:38 GMT
server
nginx
accept-language
bytes
etag
"5e57e2f6-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
Sat, 27 Feb 2021 10:21:19 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
last-modified
Thu, 27 Feb 2020 15:40:38 GMT
server
nginx
accept-language
bytes
etag
"5e57e2f6-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
Sat, 27 Feb 2021 10:21:19 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
last-modified
Thu, 27 Feb 2020 15:40:38 GMT
server
nginx
accept-language
bytes
etag
"5e57e2f6-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
Sat, 27 Feb 2021 10:21:19 GMT
metaTag.min.486310280f148d9827ab2af608ead7d9.js
js.stroeermediabrands.de/
280 KB
63 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.486310280f148d9827ab2af608ead7d9.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
96fc3aab6df34ede8189d5c9947377f1af4185dd79c151daa200cb722aa4ca8b

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
last-modified
Fri, 28 Feb 2020 09:43:01 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
Sat, 27 Feb 2021 10:21:19 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.217 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
Apache /
Resource Hash
a56833ce8542a71a519392f11f8351575830bd5ab43ff6ea30bbcb79dbbf2844
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

strict-transport-security
max-age=15768000
content-encoding
gzip
age
24951
x-cache
HIT
status
200
x-cache-hits
3833
content-length
6490
via
1.1 varnish
x-served-by
cache-hhn4047-HHN
last-modified
Fri, 28 Feb 2020 03:25:28 GMT
server
Apache
x-timer
S1582885279.356113,VS0,VE0
date
Fri, 28 Feb 2020 10:21:19 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
max-age=604800
accept-ranges
bytes
timing-allow-origin
*
expires
Fri, 06 Mar 2020 03:25:28 GMT
pre-352328ff0e.js
www.giga.de/static-local/dist/assets/js/
33 KB
11 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/pre-352328ff0e.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8f0aedeb149fe3b5bf923f3555963bf08ddf19aa1b484491e7119b3ab531c4d7

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 20 Feb 2020 12:29:55 GMT
content-encoding
gzip
x-original-content-length
34022
server
nginx
status
200
etag
W/"5e4e7b67-84e6"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
10687
expires
Fri, 19 Feb 2021 12:29:55 GMT
main-desktop-f4e314060d.css
www.giga.de/static-local/dist/assets/css/
548 KB
62 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-f4e314060d.css
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
99c2be35b40e31ffc91be910964e35410991ca48a5f15babf54414bf4a15537f

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
style

Response headers

date
Wed, 26 Feb 2020 12:41:10 GMT
content-encoding
gzip
x-original-content-length
561516
server
nginx
status
200
etag
W/"5e5666ff-8916c"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
63086
expires
Thu, 25 Feb 2021 12:41:09 GMT
iam.js
script.ioam.de/
38 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.12 000a
Resource Hash
5caa5d60bf6b85b392b45fc345204886723bafaa5dd467f76e41a200c626a6c8

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Fri, 28 Feb 2020 10:21:19 GMT
Content-Encoding
gzip
Last-Modified
Fri, 28 Feb 2020 10:21:19 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.12 000a
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
Fri, 28 Feb 2020 12:21:19 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
8db3daba71f655f21d2c31ce0a75b09e27e339241b2acd3637580db9a9eb2120

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Fri, 28 Feb 2020 10:21:19 GMT
Content-Encoding
gzip
Last-Modified
Mon, 20 Jan 2020 08:34:59 GMT
ETag
"5e256633-6fa7"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn87 gocp env
Accept-Ranges
bytes
Expires
Sat, 29 Feb 2020 10:21:19 GMT
martin-maciej-rcm40x40.jpg
static.giga.de/wp-content/uploads/2013/04/
1 KB
2 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2013/04/martin-maciej-rcm40x40.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Sun, 16 Feb 2020 14:40:51 GMT
x-content-type-options
nosniff
age
1021228
filer-source
006b20bf795e02b1f61b38f96553d06c747714f668d1b32549e4adaaaf107b9d
x-cache
HIT
status
200
accept-language
bytes
content-length
1215
x-xss-protection
1; mode=block
last-modified
Fri, 17 Jan 2020 14:40:51 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
Sun, 16 Feb 2020 14:40:51 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
106 KB
38 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
bbac7f4ecd0a368241dadd013f29d57d6754d666988ff371f102af9a7d23a6e1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 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
38645
x-xss-protection
0
server
cafe
etag
1852559682695180006
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Fri, 28 Feb 2020 10:21:19 GMT
1.gif
www.gstatic.com/psa/static/
53 B
174 B
Image
General
Full URL
https://www.gstatic.com/psa/static/1.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Tue, 04 Feb 2020 23:50:40 GMT
x-content-type-options
nosniff
last-modified
Tue, 22 Oct 2019 18:15:00 GMT
server
sffe
age
2025039
content-type
image/gif
status
200
cache-control
public, max-age=31536000
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
53
x-xss-protection
0
expires
Wed, 03 Feb 2021 23:50:40 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/c50e6523a40d4ebda6d075c30346eeff
  • https://ssl-econa.met.vgwort.de/blank.gif
43 B
332 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
161.156.66.178 , United States, ASN36351 (SOFTLAYER, US),
Reverse DNS
b2.42.9ca1.ip4.static.sl-reverse.com
Software
s2.51.1 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Fri, 28 Feb 2020 10:21:19 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.51.1
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Fri, 28 Feb 2020 10:21:19 GMT
Last-Modified
Fri, 28 Feb 2020 10:21:19 GMT
Server
s2.51.1
Location
/blank.gif
Transfer-Encoding
chunked
Content-Type
text/html
Access-Control-Allow-Origin
*
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
248 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f12d:83:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT, Fri, 28 Feb 2020 10:21:19 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-24=":443"; ma=3600
content-length
44
expires
Fri, 28 Feb 2020 10:21:19 GMT
analytics.js
www.google-analytics.com/
44 KB
18 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-352328ff0e.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 06 Feb 2020 00:21:02 GMT
server
Golfe2
age
1748
date
Fri, 28 Feb 2020 09:52:11 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
18174
expires
Fri, 28 Feb 2020 11:52:11 GMT
apstag.js
c.amazon-adsystem.com/aax2/
87 KB
25 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-352328ff0e.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.90.242 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-90-242.fra50.r.cloudfront.net
Software
Server /
Resource Hash
ac2a58f9d55c4642121cfb6f7e213cbc882bbdd75ef171ca8a07ed982ef693ce

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 04:34:50 GMT
content-encoding
gzip
server
Server
age
20788
etag
1dcfbf3986ee8b9c3abbc67eb808ab43
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA50-C1
accept-ranges
bytes
x-amz-cf-id
L_oGee4jLYAN0pcOD1W9KtlrbOxrIjw6NxNYS-Nom-08GI_K59cMyg==
via
1.1 6ea9fcffa719a56ee2be748a73d37974.cloudfront.net (CloudFront)
api
tracking.m6r.eu/sync/
Redirect Chain
  • https://cdn.m6r.eu/sync/api
  • https://tracking.m6r.eu/sync/api?checkcookies=true
1 KB
1 KB
Script
General
Full URL
https://tracking.m6r.eu/sync/api?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:19 GMT
Content-Encoding
gzip
Last-Modified
Thu, 27 Feb 2020 09:59:57 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654

Redirect headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:19 GMT
Server
nginx
Vary
Accept
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/api?checkcookies=true
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
72
Expires
Fri, 28 Feb 2020 10:21:19 GMT
identitystatus
irqs.ioam.de/
25 B
203 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.5113789311160217
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

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:19 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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000a&i2=000a169e981933c725...
  • 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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000a&i2=000a169e981933c725...
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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000a&i2=000a169e981933c725e58e99f&ep=1608215517&vr=416&id=sxnjyl&i3=000a169e981933c725e58e99f%3A1609582879397%3A1582885279397%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1582885279397&n1=3&dntt=0&lt=1582885279399&ev=&cs=699ujf&mo=1&sr=71
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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.06.2 0039
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:19 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.06.2 0039
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
Fri, 28 Feb 2020 10:21:19 GMT
X-Powered-By
BLACKBIRD-RCV v1.06.2 0039
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
Fri, 28 Feb 2020 10:21:19 GMT
Server
nginx
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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000a&i2=000a169e981933c725e58e99f&ep=1608215517&vr=416&id=sxnjyl&i3=000a169e981933c725e58e99f%3A1609582879397%3A1582885279397%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1582885279397&n1=3&dntt=0&lt=1582885279399&ev=&cs=699ujf&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
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
Thu, 28 Feb 2019 10:21:19 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/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

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
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f

Request headers

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

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
last-modified
Thu, 27 Feb 2020 15:40:38 GMT
server
nginx
accept-language
bytes
etag
"5e57e2f6-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
Sat, 27 Feb 2021 10:21:19 GMT
2006343101
videos.giga.de/embed/ Frame E10D
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/2006343101
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
34b89c38648d65a020fd24f5542ce53470907ea2166c32733f2e6a91d5e64f65

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/2006343101
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
same-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
ioam2018=000a169e981933c725e58e99f:1609582879397:1582885279397:.giga.de:2:giga:software_content:noevent:1582885279397:9ykdfa
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
server
nginx/1.14.1
date
Fri, 28 Feb 2020 10:21:19 GMT
content-type
text/html;charset=UTF-8
content-encoding
gzip
giga-c332db69e7.js
www.giga.de/static-local/dist/assets/js/bundle/
37 KB
13 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/giga-c332db69e7.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
a7529a99b9298f983b181abd0097a0314957b556fab14b3cb4547dbefe2a58b0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 20 Feb 2020 08:42:11 GMT
content-encoding
gzip
x-original-content-length
37952
server
nginx
status
200
etag
W/"5e4e4601-9440"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
13437
expires
Fri, 19 Feb 2021 08:42:11 GMT
init
d.nativendo.de/cds/delivery/
1 KB
1 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/init
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
b304a662c0afc3404a1babc46805ff9f4a6b83a4853721c2e1890940c11c36ff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
last-modified
Fri, 28 Feb 2020 10:21:19 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
523
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
collect
www.google-analytics.com/r/
35 B
101 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=1036556911&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=4GBAAEAB~&jid=710045880&gjid=1226297021&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&_r=1&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Original&z=1134277559
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:19 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
content-type
image/gif
status
200
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
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.027471513260486358
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
31bf8e20e4ce830f5643b0d3af3e0080e797f098196387018d3fd04f046fa04a
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Fri, 28 Feb 2020 10:21:19 GMT
X-Content-Type-Options
nosniff
Last-Modified
Fri, 28 Feb 2020 10:21:19 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Sat, 29 Feb 2020 10:21:04 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame BB11
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash

Request headers

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

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
Fri, 28 Feb 2020 10:21:19 GMT
Content-Length
1575
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=0ea5d10891e8919a0fdc031f4e3da872; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Thu, 28 May 2020 10:21:19 GMT; Secure; SameSite=None

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
Fri, 28 Feb 2020 10:21:19 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Fri, 28 Feb 2020 11:21:19 GMT; Secure; SameSite=None
tfa.js
cdn.taboola.com/libtrc/unip/1092206/
61 KB
21 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/unip/1092206/tfa.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
95ebbe3b755f0749ef26c07fe339baacce6266f4792e0d4cd684d064fa40b2cf

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
86MesqzKszsPH69BCFYBonhV0it_acXc
content-encoding
gzip
age
113
x-cache
HIT
status
200
date
Fri, 28 Feb 2020 10:21:19 GMT
x-amz-replication-status
COMPLETED
content-length
20920
x-amz-id-2
LI6cx4IeG+Bt2JpditpOqjn+MUsCAqQqrDtch6WaYAPzr0rNDnfLNAsDkswCIHc/iNSP/CJlE5g=
x-served-by
cache-hhn4074-HHN
last-modified
Wed, 29 Jan 2020 13:46:08 GMT
server
AmazonS3
x-timer
S1582885280.533414,VS0,VE0
etag
"2ea4087d1d031e521cbd141c1c142d48"
vary
Accept-Encoding
x-amz-request-id
4BCC8177CE4A3EF1
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
81
x-cache-hits
11
publishertag.js
static.criteo.net/js/ld/
96 KB
29 KB
Script
General
Full URL
https://static.criteo.net/js/ld/publishertag.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a02:2638:1::3 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
a7019b73cbcf928d42e36f0588c8748254ef15b914690083d80a629943267dcd

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
last-modified
Mon, 10 Feb 2020 14:17:04 GMT
server
nginx
access-control-allow-origin
*
etag
W/"5e4165e0-181f1"
content-type
text/javascript
status
200
cache-control
max-age=86400, public
timing-allow-origin
*
expires
Sat, 29 Feb 2020 10:21:19 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
43 KB
15 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.486310280f148d9827ab2af608ead7d9.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
9713194c14931a48facdd9f6fdda5247993f413dd7039e29b392d02aa7082745
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"441 / 649 of 1000 / last-modified: 1582838255"
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
14504
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:19 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
288 KB
89 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.486310280f148d9827ab2af608ead7d9.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.106 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-101-106.fra50.r.cloudfront.net
Software
/ Express
Resource Hash
2812530499183a19cfea188845c9b151821722e547ce07d848b6a496f0b43284

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 08:45:24 GMT
content-encoding
gzip
age
5755
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, max-age=10800
x-amz-cf-pop
FRA50-C1
access-control-allow-origin
*
x-amz-cf-id
wAsVtuIFsyc156I8oAqFWtJ-9X-MM_VX2sC1X_pl5GKGLWrxYWA8RQ==
via
1.1 009e5e3e32afcd1d135a7234c9da5521.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
126 KB
49 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.486310280f148d9827ab2af608ead7d9.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.210.248.245 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-210-248-245.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Fri, 28 Feb 2020 10:21:22 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
49772
Expires
Fri, 28 Feb 2020 12:21:22 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
0
-1 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:19 GMT
Server
nginx
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Content-Type
text/plain; charset=utf-8
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72

Redirect headers

Date
Fri, 28 Feb 2020 10:21:19 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/3801ce6d-e2fc-4372-aad7-038e2babe3dd/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
  • https://nugmw.userreport.com/rc-ap/3801ce6d-e2fc-4372-aad7-038e2babe3dd/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecial...
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/3801ce6d-e2fc-4372-aad7-038e2babe3dd/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20eb:d000:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
f0c687bc20b7991aaddc8cab8f750a074af32037bd3dd0661ab547e17baf0468

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
via
1.1 e0efba8a72628bfc3dc6d4d637b28302.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C1
access-control-allow-methods
get, post, options
content-type
text/javascript
status
200
cache-control
s-maxage=86400, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
1862
x-amz-cf-id
bxevTNUAm_YbTp61sYm5M4qF570QUTlkLg78aVO9xR3p4wbYsYBf0g==

Redirect headers

date
Fri, 28 Feb 2020 10:21:19 GMT
via
1.1 baaf38f0a0d54e4834bf934fa5189ceb.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA50-C1
location
https://nugmw.userreport.com/rc-ap/3801ce6d-e2fc-4372-aad7-038e2babe3dd/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
access-control-allow-methods
get, post, options
status
302
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
M-8jn-yBCJJfVT9X09ib0VmvVp2_a1UWq7_cwCaaR8eON_68Ly64-Q==
SDG_CookieLayer.min.js
cdn.stroeerdigitalgroup.de/metatag/libraries/
15 KB
3 KB
Script
General
Full URL
https://cdn.stroeerdigitalgroup.de/metatag/libraries/SDG_CookieLayer.min.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.486310280f148d9827ab2af608ead7d9.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:eb:181::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
7036c5cd37e467a149892d8d26d5ffc2c5b6724b779f76c79cb65e466ac25a7a

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
x-amz-request-id
38AA1ADB7798E5A8
status
200
access-control-max-age
86400
content-length
2480
x-amz-id-2
kSfgG+VYWwG/XoSn2/sHQzCiY272SONrVSM2ZVZIZO9dkmNKCEmJxzK4R86fxIY0wH0/Ii+hU+Y=
last-modified
Mon, 03 Feb 2020 11:33:05 GMT
server
KONICHIWA/1.0
etag
"f5261e2f36272b68033327b1f36e61ae"
vary
Accept-Encoding
access-control-allow-methods
GET,HEAD,OPTIONS
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=83475
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
collect
www.google-analytics.com/
35 B
99 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=1036556911&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Original&cd21=auto&cm17=1&cd18=4282584&z=1863413148
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Tue, 04 Feb 2020 19:35:12 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2040367
content-type
image/gif
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
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
ad-loading.png
www.dunkirkinception.com/detect/
179 B
490 B
Image
General
Full URL
https://www.dunkirkinception.com/detect/ad-loading.png?p=special/gutscheine/
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.194.129.32 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-194-129-32.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
ba263519f68b1d67e565e36be4ec1f7cb9435e7bbf7984b53a399b99e52c86de

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
image
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:22 GMT
ETag
W/"b3-dc5QKHyOFKuojJq/yFGaTGMBSEQ"
X-Powered-By
TSAdServer
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
179
post-4661cc0bdf.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-4661cc0bdf.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
a41b082a5add3cc5754af976d70900d246a3569441d546dfe86a8b6f9f19ae6a

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 27 Feb 2020 15:42:16 GMT
content-encoding
gzip
x-original-content-length
6960
server
nginx
status
200
etag
W/"5e57e2f6-1b30"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2648
expires
Fri, 26 Feb 2021 15:42:16 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/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

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
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/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
72079e05e49316d0245e16904460e88a8001bfd320327e1de68dac8d12a89114

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Fri, 28 Feb 2020 10:21:22 GMT
Content-Encoding
gzip
Last-Modified
Wed, 19 Feb 2020 20:17:12 GMT
Server
nginx
ETag
W/"5e4d97c8-74483"
Transfer-Encoding
chunked
Content-Type
application/javascript
integrator.js
adservice.google.de/adsid/
109 B
323 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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/r20200224/r20190131/
221 KB
83 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20200224/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:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
f8c08be12e015648be6e4b0040898dd78a7b950926792cd750ee70a12930b89c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 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
84611
x-xss-protection
0
server
cafe
etag
8867122644226960194
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 28 Feb 2020 10:21:19 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20200224/r20190131/ Frame 2FD3
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20200224/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:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, 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/r20200224/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

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
Mon, 24 Feb 2020 15:07:59 GMT
expires
Mon, 09 Mar 2020 15:07:59 GMT
content-type
text/html; charset=UTF-8
etag
3560819023258359450
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
4495
x-xss-protection
0
cache-control
public, max-age=1209600
age
328400
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
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/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

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
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/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Tue, 04 Feb 2020 12:01:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
2067572
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
Wed, 03 Feb 2021 12:01:47 GMT
loader.js
c.nativendo.de/cdn/asset/js/
56 KB
18 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1188
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::681a:5fb , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
b7423f3ee15c4bef2886b80f5db2fa16bac4245f4a88d6efbf9c209f66e36817

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
via
1.1 google
cf-cache-status
HIT
age
87732
cf-polished
origSize=57179
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
56c1abc5af21dfdb-FRA
expires
Fri, 26 Feb 2021 09:59:07 GMT
videojs-c972511a.min.js
videos.giga.de/dist/js/embed/bundle/ Frame E10D
619 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/2006343101
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
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5

Request headers

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

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
last-modified
Fri, 14 Feb 2020 09:20:49 GMT
server
nginx/1.14.1
etag
W/"5e466671-9aae0"
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 E10D
264 KB
90 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/2006343101
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
0fefd28ff4fcbfa351f4c584974f81f2ff156c74b1ea713a567bc49cbf2cef78
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Fri, 28 Feb 2020 10:21:19 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
91730
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:19 GMT
bid
c.amazon-adsystem.com/e/dtb/
107 B
492 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&pid=jemWsrALBYkjx&cb=0&ws=1600x1200&v=7.47.00&t=1000&slots=%5B%7B%22sd%22%3A%220%22%2C%22s%22%3A%5B%22728x90%22%2C%22800x250%22%2C%22970x250%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%221%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%222%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%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, US),
Reverse DNS
server-143-204-90-242.fra50.r.cloudfront.net
Software
Server /
Resource Hash
9694d72e65a5b488a1e18d166970ab73de4848e18766fee7634d803cef4cc8f7

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:19 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
118
via
1.1 6ea9fcffa719a56ee2be748a73d37974.cloudfront.net (CloudFront)
x-amz-cf-id
nGz8lVheoFG2-hHT_vKfaB-9yLNK0bXEahQwjXdC53vTuYkFOSHAeg==
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.90.242 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-90-242.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 06:36:25 GMT
content-encoding
gzip
vary
Origin
age
13583
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Wed, 08 Jan 2020 04:09:03 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 f7b7cf90592cf6a380fd34cc45e9c4b5.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA50-C1
x-amz-cf-id
InNTzqsqZNOMhMY3rDPPWgZT373AbYNKJlJPXBhV0wq2IALqkhbb9Q==
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame E10D
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/2006343101
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

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

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
last-modified
Fri, 14 Feb 2020 09:20:49 GMT
server
nginx/1.14.1
etag
W/"5e466671-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 E10D
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/2006343101
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

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

Response headers

date
Fri, 28 Feb 2020 10:21:19 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
Thu, 28 May 2020 10:21:19 GMT
loader.js
cdn.taboola.com/libtrc/stroeer-smb-giga/
196 KB
29 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-4661cc0bdf.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
5d976ad4578baba7e949ddd9460081a7e8d3cb71976654ef5185e5f2198e441a

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
hNHXZ7_DMZRkPR8N43IR1SUxaLv8H6KZ
content-encoding
gzip
age
79
x-cache
HIT
status
200
date
Fri, 28 Feb 2020 10:21:19 GMT
content-length
29151
x-amz-id-2
+yhMG7cx3FX6wlJMqz8m8Fhm4Ii+lHVYwkYEE58Lel46tGhRX2A/gVYtMTr/Lsmq0c/jFJH80W4=
x-served-by
cache-hhn4074-HHN
last-modified
Thu, 27 Feb 2020 15:03:00 GMT
server
AmazonS3
x-timer
S1582885280.642170,VS0,VE0
etag
"cde96a557034467c6b85234a1d57ec56"
vary
Accept-Encoding
x-amz-request-id
29AF52268BB83AD1
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
46
x-cache-hits
8
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=1036556911&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=direkt%20bei%20PayPal&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Original&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fwebapps%2Fmpp%2Fpaypal-fees&cd41=Content%201&cd45=all&cm75=1&z=1162342663
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Tue, 04 Feb 2020 19:35:12 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2040367
content-type
image/gif
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
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=1036556911&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Zum%20Geb%C3%BChrenrechner&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Original&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fib5j&cd41=Content%202&cd45=all&cm75=1&z=2045939978
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Tue, 04 Feb 2020 19:35:12 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2040367
content-type
image/gif
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
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=1036556911&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=OlegDoroshin&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Original&cd40=http%3A%2F%2Fwww.shutterstock.com%2Fgallery-363469p1.html%3Fcr%3D00%26pl%3Dedit-00&cd41=Content%203&cd45=all&cm75=1&z=384544243
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Tue, 04 Feb 2020 19:35:12 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2040367
content-type
image/gif
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
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=1036556911&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Shutterstock.com&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Original&cd40=http%3A%2F%2Fwww.shutterstock.com%2Feditorial%3Fcr%3D00%26pl%3Dedit-00&cd41=Content%204&cd45=all&cm75=1&z=115338561
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Tue, 04 Feb 2020 19:35:12 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2040367
content-type
image/gif
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
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
pixel.gif
static.criteo.net/images/
43 B
260 B
Image
General
Full URL
https://static.criteo.net/images/pixel.gif?ch=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a02:2638:1::3 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
last-modified
Tue, 09 Dec 2008 16:52:36 GMT
server
nginx
access-control-allow-origin
*
etag
"493ea254-2b"
content-type
image/gif
status
200
cache-control
max-age=31104000, public
accept-ranges
bytes
timing-allow-origin
*
content-length
43
expires
Mon, 22 Feb 2021 10:21:19 GMT
pixel.gif
static.criteo.net/images/
43 B
260 B
Image
General
Full URL
https://static.criteo.net/images/pixel.gif?ch=2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a02:2638:1::3 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
last-modified
Tue, 09 Dec 2008 16:52:36 GMT
server
nginx
access-control-allow-origin
*
etag
"493ea254-2b"
content-type
image/gif
status
200
cache-control
max-age=31104000, public
accept-ranges
bytes
timing-allow-origin
*
content-length
43
expires
Mon, 22 Feb 2021 10:21:19 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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&__id=1582885279643&__it=-60&__ic=727391&__iq=f697e9c47092634dbb44e07a137172f6&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:19 GMT
Last-Modified
Sat, 20 Feb 2010 10:20:48 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
Fri, 22 Feb 2013 10:20:48 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/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:1b , Netherlands, ASN20446 (HIGHWINDS3, US),
Reverse DNS
Software
/
Resource Hash
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
last-modified
Wed, 12 Dec 2018 18:33:51 GMT
access-control-allow-origin
*
etag
"1544639631"
vary
Accept-Encoding
x-cache
HIT
content-type
text/javascript; charset=utf-8
status
200
cache-control
public, max-age=31536000
x-hello-human
Say hello back! @getBootstrapCDN on Twitter
accept-ranges
bytes
timing-allow-origin
*
content-length
9832
ads
googleads.g.doubleclick.net/pagead/ Frame 0842
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=1582885279&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&flash=0&wgl=1&adsid=NT&dt=1582885279576&bpp=15&bdt=294&fdt=98&idt=99&shv=r20200224&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=2586042179640&frm=20&pv=2&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&ga_fc=0&iag=0&icsg=13210380126914&dssz=66&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=490&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064523%2C21065304&oid=3&pvsid=15305690729075&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=J8Jn6JkB7B&p=https%3A//www.giga.de&dtd=133
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200224/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, 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=1582885279&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&flash=0&wgl=1&adsid=NT&dt=1582885279576&bpp=15&bdt=294&fdt=98&idt=99&shv=r20200224&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=2586042179640&frm=20&pv=2&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&ga_fc=0&iag=0&icsg=13210380126914&dssz=66&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=490&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064523%2C21065304&oid=3&pvsid=15305690729075&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=J8Jn6JkB7B&p=https%3A//www.giga.de&dtd=133
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

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
Fri, 28 Feb 2020 10:21:20 GMT
server
cafe
content-length
10676
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Fri, 28-Feb-2020 10:36:19 GMT; path=/; domain=.doubleclick.net; Secure; SameSite=none
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
Fri, 28 Feb 2020 10:21:20 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
73 KB
27 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/r20200224/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
261a1dfeeccd3f6747dd6bb49e60579c2582910c2b225d23677772825bf7bc3d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582753860897921"
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
27728
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:19 GMT
dmp
tracking.m6r.eu/sync/
97 B
621 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
6fcf182afcd8adff07093ddefe45b3c6f3b7495f141d14f9dd779f9621a05706

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:19 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
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/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

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
ads
googleads.g.doubleclick.net/pagead/ Frame ADD7
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1582885279&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1582885279591&bpp=4&bdt=309&fdt=167&idt=167&shv=r20200224&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=2586042179640&frm=20&pv=1&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&ga_fc=0&iag=0&icsg=52841520507662&dssz=68&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=21064523%2C21065304&oid=3&pvsid=15305690729075&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=171
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200224/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, 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=1582885279&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1582885279591&bpp=4&bdt=309&fdt=167&idt=167&shv=r20200224&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=2586042179640&frm=20&pv=1&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&ga_fc=0&iag=0&icsg=52841520507662&dssz=68&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=21064523%2C21065304&oid=3&pvsid=15305690729075&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=171
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

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
Fri, 28 Feb 2020 10:21:19 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Fri, 28-Feb-2020 10:36:19 GMT; path=/; domain=.doubleclick.net; Secure; SameSite=none
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
Fri, 28 Feb 2020 10:21:19 GMT
cache-control
private
nativendo.css
c.nativendo.de/cdn/asset/css/
6 KB
1 KB
Stylesheet
General
Full URL
https://c.nativendo.de/cdn/asset/css/nativendo.css?v=1188
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1188
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:5fb , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
d9d50f91b9fa32568a08b88e9758859316046c7ee530542cf3a7dd6bd334d657

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
style

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
via
1.1 google
cf-cache-status
HIT
age
87732
cf-polished
origSize=7333
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
56c1abc6a977dfdb-FRA
expires
Fri, 26 Feb 2021 09:59:07 GMT
impl.20200227-25-RELEASE.js
cdn.taboola.com/libtrc/
443 KB
125 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20200227-25-RELEASE.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
0db8c8b58ac001930300be6c24e1f0c4077f69edeb3117432cbd95234f03f179

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
mRHKjyO_IuBzBhyvIljIjecmjTR.JZmS
content-encoding
gzip
age
102
x-cache
HIT
status
200
date
Fri, 28 Feb 2020 10:21:19 GMT
x-amz-replication-status
COMPLETED
content-length
128081
x-amz-id-2
axor9B5pWOvCeR7LCcqPk/Wp9nLgdITMZ+oZuz1hrDCSjm/4bA9mgV7kOVVaS2UjzaTU6lurBkc=
x-served-by
cache-hhn4074-HHN
last-modified
Thu, 27 Feb 2020 14:56:26 GMT
server
AmazonS3
x-timer
S1582885280.801631,VS0,VE0
etag
"d9471b8f94a83a43bc7566725a6867b0"
vary
Accept-Encoding
x-amz-request-id
5696637F481D8032
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
81
x-cache-hits
1162
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
23.43.115.95 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-43-115-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a256529bd5b1b8846f8d2536ce7581fb6cea4479992f222d01535903dff48d79

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Fri, 28 Feb 2020 10:21:33 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
884
Expires
Sat, 29 Feb 2020 10:21:33 GMT
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=89ceb345-90db-4a47-a654-84bb00b8ca2c&smb_sp=&smb_ch=software
Requested by
Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
4ac552ae33c3b508ee45ba3905936d6fed91e6140c0c156041e796726b9a3a0c

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Fri, 28 Feb 2020 10:21:19 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1515
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=1036556911&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=2006343101%20--%20Das%20solltest%20du%20%C3%BCber%20PayPal%20wissen%5Bvideojs%2F7.6.6%5D%5BUser%20Click2Play%5D&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Original&cd9=20160501&cd11=2006343101&cd12=SELF&cd13=70&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.6&cd44=1&cm1=1&z=759325640
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Tue, 04 Feb 2020 19:35:12 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2040367
content-type
image/gif
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
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
2f569144df7e0c84ae662ad76a_ciA2NTADZGMyNjRmMDQ2YTY=.png
files.giga-video.de/da/5c/dc/ Frame E10D
15 KB
15 KB
Image
General
Full URL
https://files.giga-video.de/da/5c/dc/2f569144df7e0c84ae662ad76a_ciA2NTADZGMyNjRmMDQ2YTY=.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
69f049c8296fa63b9a344f13a405b4f6e58432556da4b3e202af9788dae100ea
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 22 Feb 2020 06:06:19 GMT
x-content-type-options
nosniff
age
533701
filer-source
5d49872525e25fa08a218d05803618e85dbbffacfec14597f6cf6333e144ba71
x-cache
HIT
status
200
accept-language
bytes
content-length
15022
x-xss-protection
1; mode=block
last-modified
Sat, 22 Feb 2020 06:06:19 GMT
server
nginx/1.10.3
filer-attr
W1s2NTAsMzY2XSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 23 Mar 2020 06:06:19 GMT
68dd477d-2fba-43a8-bd81-5aa836eefe71
https://videos.giga.de/ Frame E10D
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/68dd477d-2fba-43a8-bd81-5aa836eefe71
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

Request headers

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

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 E10D
53 B
703 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-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.73.48 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Referer
https://videos.giga.de/embed/2006343101
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:20 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
B2957F7700D65A2A
Content-Length
53
x-amz-id-2
EPXpryCq/ZktOkOh36RJDUFF1g/N6XKZtFYRJ5es+md3K4qE2YiJJx76r6XREIXqvmLL7Bcjhjw=
Last-Modified
Fri, 28 Feb 2020 05:24:55 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame E10D
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.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

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

Response headers

date
Fri, 28 Feb 2020 10:21:19 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
Fri, 28 Feb 2020 10:36:19 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame E10D
754 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-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.73.19 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-225-73-19.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb

Request headers

Referer
https://videos.giga.de/embed/2006343101
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:20:56 GMT
Via
1.1 56fad5a50ef67bd961b9722ed0931839.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
25
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
754
Last-Modified
Wed, 22 Jan 2020 03:58:13 GMT
Server
AmazonS3
ETag
"b7cafd7f52366c401d1297c997d1b09d"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA2-C2
Accept-Ranges
bytes
X-Amz-Cf-Id
St8xoWWF7LxtbLP9EVudbbqEyX4I-En16RO2RlTqkVqVWGCow9xzTQ==
Expires
0
json
trc.taboola.com/stroeer-smb-giga/trc/3/
17 KB
7 KB
Script
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=11%3A21%3A19.953&lti=deflated&data=%7B%22id%22%3A698%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1582885279614%2C%22cv%22%3A%2220200227-25-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A3566%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%3A2795.3125%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.20200227-25-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
3a5e0f7683e69b0fec5c66efac66df080115ffc02129412ee050b06b4ee78ced

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-vcl-time-ms
255
date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
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
via
1.1 varnish
x-served-by
cache-hhn4074-HHN
server
nginx
x-timer
S1582885280.965843,VS0,VE255
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame 4D51
Redirect Chain
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
0
0
Document
General
Full URL
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&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.95.123.41 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Server /
Resource Hash

Request headers

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

Response headers

Server
Server
Date
Fri, 28 Feb 2020 10:21:20 GMT
Content-Type
text/html;charset=ISO-8859-1
Content-Length
183
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=A9Z3uMPDj0Uak_R9s224Q5s; Domain=.amazon-adsystem.com; Expires=Thu, 01-Oct-2020 10:21:20 GMT; Path=/; Secure; HttpOnly; SameSite=None ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Tue, 01-Apr-2025 10:21:20 GMT; Path=/; Secure; HttpOnly; SameSite=None
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Fri, 28 Feb 2020 10:21:20 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=3lift&dcc=t
Set-Cookie
ad-id=A9Z3uMPDj0Uak_R9s224Q5s|t; Domain=.amazon-adsystem.com; Expires=Thu, 01-Oct-2020 10:21:20 GMT; Path=/; Secure; HttpOnly; SameSite=None
Vary
User-Agent
pubads_impl_2020022401.js
securepubads.g.doubleclick.net/gpt/
167 KB
61 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
6d941ee14efe29bc4859114b4d6c93bd58d9843249a4e9d7603d6f80edb4eadf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 24 Feb 2020 14:08:08 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
62028
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:19 GMT
session
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 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.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Fri, 28 Feb 2020 10:21:21 GMT
bid
orbidder.otto.de/
0
0

bid
orbidder.otto.de/
0
0

translator
hbopenbid.pubmatic.com/
0
0

v1
prg.smartadserver.com/prebid/
0
0

/
adx.adform.net/adx/
0
0

arj
yieldlove-d.openx.net/w/1.0/
0
0

9767196,9767198,9767205
ad.yieldlab.net/yp/
2 B
759 B
XHR
General
Full URL
https://ad.yieldlab.net/yp/9767196,9767198,9767205?ts=1582885279996&json=true
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.16.122.151 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-16-122-151.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:20 GMT
Content-Encoding
gzip
p3p
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
en-US
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
28
Expires
Thu, 27 Feb 2020 10:21:20 GMT
v1
dmx.districtm.io/b/
0
460 B
XHR
General
Full URL
https://dmx.districtm.io/b/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.190.66 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

Access-Control-Request-Method
POST
Origin
https://www.giga.de
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Access-Control-Request-Headers
content-type

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
cf-cache-status
DYNAMIC
server
cloudflare
access-control-allow-origin
https://www.giga.de
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
origin, Accept-Encoding
access-control-allow-methods
OPTIONS, POST
status
204
access-control-max-age
14400
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-ray
56c1abca1b55bdd2-AMS
access-control-allow-headers
origin, content-type
bid
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 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.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Fri, 28 Feb 2020 10:21:21 GMT
auction
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 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.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Fri, 28 Feb 2020 10:21:21 GMT
/
d.nativendo.de/cds/delivery/get/
2 KB
1 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/get/?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1188
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
368409e58e5955c2edffe7050007d98dfdb1c7a0afe8a8eae551734a6057a381

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
last-modified
Fri, 28 Feb 2020 10:21:20 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
696
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=480b4494fe340ce3569442613ff79465&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D480b4494fe340ce3569442613ff79465%2...
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=480b4494fe340ce3569442613ff79465&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D480b4494fe340ce3569442613ff79465%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=480b4494fe340ce3569442613ff79465&userId=adscale-user:2f15890f9c2343c8b81f527aed808cfa
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=480b4494fe340ce3569442613ff79465&userId=adscale-user%3A2f15890f9c2343c8b81f527aed808cfa&checkcookies=true
44 B
574 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=480b4494fe340ce3569442613ff79465&userId=adscale-user%3A2f15890f9c2343c8b81f527aed808cfa&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:20 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=480b4494fe340ce3569442613ff79465&userId=adscale-user%3A2f15890f9c2343c8b81f527aed808cfa&checkcookies=true
Date
Fri, 28 Feb 2020 10:21:20 GMT
Server
nginx
Connection
keep-alive
Content-Length
185
Content-Type
text/plain; charset=utf-8
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=480b4494fe340ce3569442613ff79465
43 B
876 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=480b4494fe340ce3569442613ff79465
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.209 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
314.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

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:22 GMT
AN-X-Request-Uuid
0ca78fff-fcb6-43a1-a823-ba9b914cf707
Content-Type
image/gif
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
X-Proxy-Origin
185.210.217.118; 185.210.217.118; 314.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.43:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=480b4494fe340ce3569442613ff79465
Date
Fri, 28 Feb 2020 10:21:20 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
98
Content-Type
text/plain; charset=utf-8
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=SAtElP40DONWlEJhP_eUZQ
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889%2C0&checkcookies=true
44 B
569 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889%2C0&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:20 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

Location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889%2C0&checkcookies=true
Date
Fri, 28 Feb 2020 10:21:20 GMT
Server
nginx
Connection
keep-alive
Content-Length
105
Content-Type
text/plain; charset=utf-8
m
ad.yieldlab.net/
Redirect Chain
  • https://tracking.m6r.eu/sync/yieldlabRedirect
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=480b4494fe340ce3569442613ff79465
0
360 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=480b4494fe340ce3569442613ff79465
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:20 GMT
x-content-type-options
nosniff
x-frame-options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
x-xss-protection
1; mode=block
x-application-context
application
Expires
Thu, 27 Feb 2020 10:21:20 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=480b4494fe340ce3569442613ff79465
Date
Fri, 28 Feb 2020 10:21:20 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
99
Content-Type
text/plain; charset=utf-8
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame E10D
201 KB
59 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=KYTsHAWLoR
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.73.19 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-225-73-19.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
23de42593f95545fae0d97f983c8d78378ce70042a58c449730406a9dda5339a

Request headers

Referer
https://videos.giga.de/embed/2006343101
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:20:33 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
48
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
https://videos.giga.de
Last-Modified
Mon, 24 Feb 2020 10:47:31 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 56fad5a50ef67bd961b9722ed0931839.cloudfront.net (CloudFront)
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA2-C2
X-Amz-Cf-Id
ntjofZnVQ3dBo-LfvsVg5fZiy1yV0LunvoYn1smPJu9DcNn_i7qjTA==
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=15305690729075&correlator=3709812591773013&output=ldjh&impl=fif&adsid=NT&eid=21064523%2C21065304&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=1x1&ists=1&prev_scp=as%3Dout_of_page%26adslot%3Dout_of_page%26pc%3D1%26af%3Dtickerad&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D19%26smb-hour%3D11%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D480b4494fe340ce3569442613ff79465%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1582885280&dt=1582885280046&dlt=1582885279282&idt=745&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933&adys=-12245933&adks=2540211652&ucis=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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=74&icsg=3381857312490400&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x0&msz=1x1&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
b6179840b256eabf14abf1359e73f1272a73440f0c64101f0afee0c7deb4e0d9
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:20 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
1823
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
pubads_impl_rendering_2020022401.js
securepubads.g.doubleclick.net/gpt/
66 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
816709e9295a4116a9f1648dcdca148a141e0ee263887b39f474a923380e4310
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 24 Feb 2020 14:08:08 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
24743
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:20 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

ads
securepubads.g.doubleclick.net/gampad/
7 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=15305690729075&correlator=3709812591773013&output=ldjh&impl=fif&adsid=NT&eid=21064523%2C21065304&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&prev_scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A20918.scenario%253Adefault%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2Cvto&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D19%26smb-hour%3D11%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D480b4494fe340ce3569442613ff79465%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582885280&dt=1582885280065&dlt=1582885279282&idt=745&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933&adys=-12245933&adks=2257154448&ucis=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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=75&icsg=3381857312490400&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
2b97730bb566e975de12ff9ddff705b05dedd494cf4f70c7853f6bfd403703b4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:20 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
3360
x-xss-protection
0
google-lineitem-id
5303510603
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138303782932
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
7 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=15305690729075&correlator=3709812591773013&output=ldjh&impl=fif&adsid=NT&eid=21064523%2C21065304&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&prev_scp=as%3Dsky%26adslot%3Dsky%26af%3Dfirepl%2Cwp%2Cvidwa%2Cf1x4%2Cf1x3%2Cf1x2%2Cds%2Cdds%2Csky%2Chpad%2Cband%26rfree%3D200-299%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A19051.scenario%253Adefault%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D19%26smb-hour%3D11%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D480b4494fe340ce3569442613ff79465%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582885280&dt=1582885280070&dlt=1582885279282&idt=745&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933&adys=-12245933&adks=2778923653&ucis=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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=75&icsg=3381857312490400&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
95fb08748cffae2fd954e5c468c2dd22415a054a5756e2501c8a9cbb9ce2adfd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:20 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
3502
x-xss-protection
0
google-lineitem-id
5302344717
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138303369111
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
7 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=15305690729075&correlator=3709812591773013&output=ldjh&impl=fif&adsid=NT&eid=21064523%2C21065304&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=10x20%7C10x10%7C300x250%7C34x31&prev_scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9501.scenario%253Adefault%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D19%26smb-hour%3D11%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D480b4494fe340ce3569442613ff79465%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582885280&dt=1582885280075&dlt=1582885279282&idt=745&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933&adys=-12245933&adks=1428895410&ucis=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%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=75&icsg=3381857312490400&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=1282240822.1582885279&ga_sid=1582885280&ga_hid=1036556911&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
b5d8661777bb2e8b16d2c80755be1ebcc9b8bbc7fda8232d7267e89b97714724
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:20 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
3485
x-xss-protection
0
google-lineitem-id
5303510597
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138303416822
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
truncated
/ Frame E10D
201 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
23de42593f95545fae0d97f983c8d78378ce70042a58c449730406a9dda5339a

Request headers

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

Response headers

Content-Type
text/javascript
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
36 KB
9 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, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
8ab45573cf6d63b2617a3a6a97af02c584354d0646f4652ea0a72c1ec20adc75

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Fri, 28 Feb 2020 10:21:20 GMT
Content-Encoding
gzip
Age
3443
X-Cache
HIT
Connection
keep-alive
Content-Length
8413
x-amz-id-2
votXFVEakOrroEx1ClLXHN327Ksk2vEwMxSZbyG1PUESLXzly2+iPhSaYsqwgebmZCsfglFp5p4=
X-Served-By
cache-hhn4043-HHN
Last-Modified
Fri, 28 Feb 2020 06:27:38 GMT
Server
AmazonS3
X-Timer
S1582885280.194351,VS0,VE0
ETag
"c59001a13e7230e78fc00136a746d026"
x-amz-request-id
83A0FAB8EE2A0F2E
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
14874
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame A2AA
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvkK8Z6PkPq0dsINAi9TudqX4kKH79rCuQlOS33fjEHRCWj9JjurqlffMI0tB-gPT26XRt6VNhOMSVWMY-rZUmfhOzDKRzqmmqPjkZ1MTdZ5d07B0HOpVtF7kXK1KcTQG_yYvEK1Qm-5...
  • 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:eb:181::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
access-control-allow-origin
*
etag
"3260aadd174a1ebd50d0bd967c8fadea:1494950026"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
status
200
cache-control
max-age=463549
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Wed, 04 Mar 2020 19:07:09 GMT

Redirect headers

date
Fri, 28 Feb 2020 10:21:20 GMT
x-content-type-options
nosniff
content-type
text/html; charset=UTF-8
server
cafe
access-control-allow-origin
*
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"
status
302
cache-control
private
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
0
x-xss-protection
0
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/202002261447/
31 KB
12 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/202002261447/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, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
5d900e780c1bfffd1d07df8acbd5f2feaf75be4e405a53ec670720340bf2a5c6

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Fri, 28 Feb 2020 10:21:20 GMT
Content-Encoding
gzip
Age
287
X-Cache
HIT
Connection
keep-alive
Content-Length
11691
x-amz-id-2
Fu/2t2sC1w1nDIyeVhocrej9iYRTqJeZL2QSO5TvnVw2u3+fPbB67xwDoLWHESWOa81t2P0IYJo=
X-Served-By
cache-hhn4043-HHN
Last-Modified
Thu, 27 Feb 2020 16:09:56 GMT
Server
AmazonS3
X-Timer
S1582885280.218737,VS0,VE0
ETag
"a2fea0bcec7b14984763e83147b8f6f7"
x-amz-request-id
A7A14856A4E400A5
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
959
tb
15.taboola.com/
32 KB
32 KB
Script
General
Full URL
https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&encoded=1&uid=4ecff77f-e3c1-49ca-b576-3f6dc4606d8c-tuct5526f1f&variant=0|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1582885280241&tagid=&cntry=BE&platform=1&sesid=7c3e6bcec92a9bd49dccba2c45e6e819&itemid=/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln&viewid=1582885279614&geolat=&geoing=&deviceifa=&appid=&sd=v2_7c3e6bcec92a9bd49dccba2c45e6e819_4ecff77f-e3c1-49ca-b576-3f6dc4606d8c-tuct5526f1f_1582885279_1582885279_CNawjgYQrMVBGP6uwtqILiABKAEwFjjqxgdA6YYQSNHewgFQ____________AVgAYAA&ri=83a515ca88a1b7bd645e5191027c17a2&appname=&cdb=&gdprApplies=&rid=&sii=-87077898386902071&oee=true&tpubid=1073836
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200227-25-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
85a7c7218d6f1e88384824a99e164b8d8fe7da5c4e0e8f1b340d4225e6bc2feb

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885281.546941,VS0,VE17
machineid
1449
x-served-by
cache-hhn4083-HHN
x-cache
MISS
content-type
text/html;charset=ISO-8859-1
status
200
cache-control
no-cache,must-revalidate,no-store,max-age=0,s-maxage=0
x-cache-hits
0
accept-ranges
bytes
expires
Sat, 26 Jul 1997 05:00:00 GMT
feed-card-placeholder.20200227-25-RELEASE.es6.js
cdn.taboola.com/libtrc/
5 KB
2 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/feed-card-placeholder.20200227-25-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f3b71d19cc05d330721309283a4eaaaaafcdea40ba29c66f78260ce4c7e7ac73

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
qGAL5oqQbACHtD2wN2aYhVeeunERDAT0
content-encoding
gzip
age
97
x-cache
HIT
status
200
date
Fri, 28 Feb 2020 10:21:20 GMT
x-amz-replication-status
COMPLETED
content-length
1269
x-amz-id-2
Wv+D35O2teG8DPxBz4Pny/3i4x/mfgXek+dgguotRszOmL2ERRb6WIK2TuHW3sIBsRDQ6SWSJ2Y=
x-served-by
cache-hhn4074-HHN
last-modified
Thu, 27 Feb 2020 14:56:41 GMT
server
AmazonS3
x-timer
S1582885280.251386,VS0,VE0
etag
"6df89e4a88fcef42a2f44fa8991b847f"
vary
Accept-Encoding
x-amz-request-id
0BD9325907425457
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
66
x-cache-hits
661
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.20200227-25-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

x-amz-version-id
cMrDKn.emLmm9kiiOOF64ulDT4DRy6LK
content-encoding
gzip
age
84
x-cache
HIT
status
200
date
Fri, 28 Feb 2020 10:21:20 GMT
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
l03aK5coDHMxIVw6UZl95levmMG8DMwBQ/PIj7cySTLGvEdRI+h9vWEhWmVryH43NVPNS4ftZQ8=
x-served-by
cache-hhn4074-HHN
access-control-allow-origin
*
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1582885280.253508,VS0,VE0
etag
"b8b410e4b18d45aa2f3d9bc09cd335fb"
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
C1B09E8B7F992D0F
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
66
x-cache-hits
313
userx.20200227-25-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20200227-25-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
7a8b5f0939260d973c77a0164a212535f4d5a3d69c57732a9f652d34be663e3e

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
WSiBZNFIg2qyrEsmmjs9.gUXfID1Odjh
content-encoding
gzip
age
93
x-cache
HIT
status
200
date
Fri, 28 Feb 2020 10:21:20 GMT
x-amz-replication-status
COMPLETED
content-length
7712
x-amz-id-2
z1lOeZ+yzWJrZgOpOdkOp0GHpLCoGWnSDSoI/JevBtmsi9NbBYE+MgYhNtAY0soLW5IrnT9rhLg=
x-served-by
cache-hhn4074-HHN
last-modified
Thu, 27 Feb 2020 14:56:33 GMT
server
AmazonS3
x-timer
S1582885280.293600,VS0,VE0
etag
"2f676bbd6903a3b0171724e529d66892"
vary
Accept-Encoding
x-amz-request-id
9FB24C7D38FD916F
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
66
x-cache-hits
321
rtb-h
trc.taboola.com/sg/exposebox-network/1/ Frame 7D42
Redirect Chain
  • https://server.exposebox.com/rcm
  • https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_iro3u47
0
53 B
Image
General
Full URL
https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_iro3u47
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

x-vcl-time-ms
8
date
Fri, 28 Feb 2020 10:21:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885281.670980,VS0,VE8
x-served-by
cache-hhn4074-HHN
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

date
Fri, 28 Feb 2020 10:21:20 GMT
via
1.1 google
x-powered-by
Express
location
//trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_iro3u47
p3p
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
status
302
cache-control
max-age:0
alt-svc
clear
expires
0
match
match.zorosrv.com/ Frame 7D42
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=5ee839d3-b0c1-47a4-8453-9b3198c2810e
  • https://match.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=5ee839d3-b0c1-47a4-8453-9b3198c2810e&tbid=2a9b8f16-10bb-4096-becd-7fe54b3aaca6-tuct5526f21&query=taboola_hm%3D5ee839d3-b0c1-...
  • https://match.zorosrv.com/match?tabid=2a9b8f16-10bb-4096-becd-7fe54b3aaca6-tuct5526f21&extuid=5ee839d3-b0c1-47a4-8453-9b3198c2810e&excid=218&query=taboola_hm%3D5ee839d3-b0c1-47a4-8453-9b3198c2810e
0
292 B
Image
General
Full URL
https://match.zorosrv.com/match?tabid=2a9b8f16-10bb-4096-becd-7fe54b3aaca6-tuct5526f21&extuid=5ee839d3-b0c1-47a4-8453-9b3198c2810e&excid=218&query=taboola_hm%3D5ee839d3-b0c1-47a4-8453-9b3198c2810e
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885282.580029,VS0,VE9
x-cache
MISS
p3p
policyref="/w3c/p3p.xml", CP="NOI IDC DSP COR CURa ADMa OUR IND COM STA NOR UNI"
status
200
x-cache-hits
0
accept-ranges
bytes
access-control-allow-headers
X-Requested-With, X-Prototype-Version, Content-Type, Origin, Allow
content-length
0
x-served-by
cache-fra19137-FRA

Redirect headers

date
Fri, 28 Feb 2020 10:21:21 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885282.547192,VS0,VE9
location
https://match.zorosrv.com/match?tabid=2a9b8f16-10bb-4096-becd-7fe54b3aaca6-tuct5526f21&extuid=5ee839d3-b0c1-47a4-8453-9b3198c2810e&excid=218&query=taboola_hm%3D5ee839d3-b0c1-47a4-8453-9b3198c2810e
x-cache
MISS
status
302
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19137-FRA
sync.php
pixel.rubiconproject.com/exchange/ Frame 7D42
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
69.173.144.138 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT, US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Cache-Control
no-cache,no-store,must-revalidate
Content-Type
image/gif
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
X-RPHost
3bafef7aa4e37890defcd73f0a080481
Expires
0
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame 7D42
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=y08IMszXn8vpzkjb0bcKBXRYJZBnrmb2IvRTOrgXRUU%3D
45 B
269 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=y08IMszXn8vpzkjb0bcKBXRYJZBnrmb2IvRTOrgXRUU%3D
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4

Request headers

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

Response headers

x-vcl-time-ms
10
date
Fri, 28 Feb 2020 10:21:22 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885282.028045,VS0,VE10
x-served-by
cache-hhn4074-HHN
x-cache
MISS
status
200
accept-ranges
bytes
x-cache-hits
0

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=y08IMszXn8vpzkjb0bcKBXRYJZBnrmb2IvRTOrgXRUU%3D
Date
Fri, 28 Feb 2020 10:21:22 GMT
Server
nginx
Connection
close
Etag
"y08IMszXn8vpzkjb0bcKBXRYJZBnrmb2IvRTOrgXRUU="
Content-Length
0
/
trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/ Frame 7D42
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://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]&mm_bnc&mm_bct&UUID=2d475e58-e9a1-4600-bb01-ec52c52646b1
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=2d475e58-e9a1-4600-bb01-ec52c52646b1
0
54 B
Image
General
Full URL
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=2d475e58-e9a1-4600-bb01-ec52c52646b1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

x-vcl-time-ms
9
date
Fri, 28 Feb 2020 10:21:21 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885281.086797,VS0,VE9
x-served-by
cache-hhn4074-HHN
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

Date
Fri, 28 Feb 2020 10:22:08 GMT
Server
MT3 2129 8dd2d16 master cdg-pixel-x21
P3P
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
location
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=2d475e58-e9a1-4600-bb01-ec52c52646b1
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Keep-Alive
timeout=360
Content-Length
0
Expires
Fri, 28 Feb 2020 10:22:07 GMT
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/ Frame 7D42
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=Uvcq0ihcWdZh&ev=1&pid=562107
0
79 B
Image
General
Full URL
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=Uvcq0ihcWdZh&ev=1&pid=562107
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

x-vcl-time-ms
27
date
Fri, 28 Feb 2020 10:21:21 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885281.992401,VS0,VE27
x-served-by
cache-hhn4074-HHN
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

strict-transport-security
max-age=15768000
server
Jetty(9.4.14.v20181114)
p3p
policyref="/bh/w3c/p3p.xml", CP="NOI DSP COR NID CURa DEVa PSAa OUR BUS COM NAV INT"
location
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=Uvcq0ihcWdZh&ev=1&pid=562107
content-language
en-US
status
302
cache-control
private, max-age=0, no-cache, no-store
cw-server
bh-deployment-6c55bfb4dd-rqjl6
expires
-1
/
trc.taboola.com/sg/rtbhouse-network/1/rtb-h/ Frame 7D42
Redirect Chain
  • https://creativecdn.com/cm-notify?pi=taboola
  • https://ams.creativecdn.com/cm-notify?pi=taboola&tc=1
  • https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=yoRvyYLofJy14Cc1PGjj&pi=taboola&tc=1
0
54 B
Image
General
Full URL
https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=yoRvyYLofJy14Cc1PGjj&pi=taboola&tc=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

x-vcl-time-ms
8
date
Fri, 28 Feb 2020 10:21:22 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885282.428953,VS0,VE8
x-served-by
cache-hhn4074-HHN
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

status
302
pragma
no-cache
date
Fri, 28 Feb 2020 10:21:22 GMT, Fri, 28 Feb 2020 10:21:22 GMT
cache-control
no-cache, no-store, must-revalidate, private, max-age=0
content-length
0
location
https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=yoRvyYLofJy14Cc1PGjj&pi=taboola&tc=1
expires
Thu, 01 Jan 1970 00:00:00 GMT
getuidnb
ib.adnxs.com/ Frame 7D42
43 B
695 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.209 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
314.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

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

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:23 GMT
AN-X-Request-Uuid
e0db3839-5f35-456f-bc56-c316a1b047e3
Content-Type
image/gif
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
X-Proxy-Origin
185.210.217.118; 185.210.217.118; 314.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.165:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
/
trc.taboola.com/sg/google-network/1/rtb-h/ Frame 7D42
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=CAESEDG-5oLMCvQqiESRgbM6sUc&google_cver=1
0
178 B
Image
General
Full URL
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEDG-5oLMCvQqiESRgbM6sUc&google_cver=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

x-vcl-time-ms
8
date
Fri, 28 Feb 2020 10:21:21 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885281.041727,VS0,VE8
x-served-by
cache-hhn4074-HHN
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:21 GMT
server
HTTP server (unknown)
location
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEDG-5oLMCvQqiESRgbM6sUc&google_cver=1
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
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
304
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
getuidnb
ib.adnxs.com/ Frame 7D42
43 B
695 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.209 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
314.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

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

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:23 GMT
AN-X-Request-Uuid
9764a66f-ab41-4aef-bb2f-7e655a62a1d9
Content-Type
image/gif
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
X-Proxy-Origin
185.210.217.118; 185.210.217.118; 314.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.222.244:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
/
trc.taboola.com/sg/thetradedesk-network/1/rtb-h/ Frame 7D42
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=624c3ec4-6483-4b7f-ab4d-807a7271cd6b
0
177 B
Image
General
Full URL
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=624c3ec4-6483-4b7f-ab4d-807a7271cd6b
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

x-vcl-time-ms
8
date
Fri, 28 Feb 2020 10:21:21 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885281.220837,VS0,VE8
x-served-by
cache-hhn4074-HHN
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:21 GMT
x-aspnet-version
4.0.30319
location
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=624c3ec4-6483-4b7f-ab4d-807a7271cd6b
p3p
CP="NOI DSP COR CUR ADMo DEVo PSAo PSDo OUR SAMo BUS UNI NAV"
status
302
cache-control
private,no-cache, must-revalidate
content-type
text/html
content-length
239
rtb-h
trc.taboola.com/sg/storygize-network/1/ Frame 7D42
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=4ecff77f-e3c1-49ca-b576-3f6dc4606d8c-tuct5526f1f
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
0
57 B
Image
General
Full URL
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

x-vcl-time-ms
9
date
Fri, 28 Feb 2020 10:21:22 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885283.888840,VS0,VE9
x-served-by
cache-hhn4074-HHN
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

Location
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
Pragma
no-cache
expires
0
cache-control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
P3P
CP ALL ADM DEV PSAi COM OUR OTRo STP IND ONL
cookiesync
bttrack.com/pixel/ Frame 7D42
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
192.132.33.46 , United States, ASN18568 (BIDTELLECT, US),
Reverse DNS
46.bidtellect.com
Software
Microsoft-IIS/8.5 /
Resource Hash
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992

Request headers

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

Response headers

X-ServerName
Track002-dc3
Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:21 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 7D42
0
176 B
Image
General
Full URL
https://cds.taboola.com/?uid=4ecff77f-e3c1-49ca-b576-3f6dc4606d8c-tuct5526f1f&_r=5155983
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
141.226.224.32 , United States, ASN200478 (TABOOLA-AS, IL),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Date
Fri, 28 Feb 2020 10:21:21 GMT
cache-control
no-store
x-envoy-upstream-service-time
0
Server
nginx
Connection
close
Content-Length
0
/
trc.taboola.com/sg/bidswitch-network/1/rtb-h/ Frame 7D42
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola
  • https://p.rfihub.com/cm?in=1&pub=20513&ssp=taboola
  • https://x.bidswitch.net/sync?dsp_id=119&user_id=1870471594548486892&expires=30&ssp=taboola
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=01311580-9501-48e7-befa-5fcce60ef212
0
55 B
Image
General
Full URL
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=01311580-9501-48e7-befa-5fcce60ef212
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

x-vcl-time-ms
8
date
Fri, 28 Feb 2020 10:21:22 GMT
via
1.1 varnish
server
nginx
x-timer
S1582885283.792255,VS0,VE8
x-served-by
cache-hhn4074-HHN
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

status
302
date
Fri, 28 Feb 2020 10:21:22 GMT
cache-control
no-cache, no-store, must-revalidate
content-length
0
location
//trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=01311580-9501-48e7-befa-5fcce60ef212
p3p
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
collect
www.google-analytics.com/
35 B
99 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=1036556911&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEAB~&jid=&gjid=&cid=1282240822.1582885279&tid=UA-204785-4&_gid=1182601355.1582885279&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Original&cm73=1&cm13=1&z=796329693
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Tue, 04 Feb 2020 19:35:12 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2040369
content-type
image/gif
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
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
388 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.20200227-25-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Fri, 28 Feb 2020 10:21:20 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-hhn4074-HHN
pragma
no-cache
server
nginx
x-timer
S1582885280.319862,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
57 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.20200227-25-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Fri, 28 Feb 2020 10:21:20 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-hhn4074-HHN
pragma
no-cache
server
nginx
x-timer
S1582885280.322434,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.20200227-25-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Fri, 28 Feb 2020 10:21:20 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-hhn4074-HHN
pragma
no-cache
server
nginx
x-timer
S1582885280.324482,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.20200227-25-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Fri, 28 Feb 2020 10:21:20 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-hhn4074-HHN
pragma
no-cache
server
nginx
x-timer
S1582885280.324751,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
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
726 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200227-25-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

x-amz-version-id
hL.cyLD7Q4TL5ceY.7JQwF9m5IYI8mkC
via
1.1 varnish
age
10231
x-cache
HIT
status
200
date
Fri, 28 Feb 2020 10:21:21 GMT
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
grODyaFUyHwi27S6u2hd746yPHwUf+y1im5Wn93DxT7wozhn8KMFUP712WAAG3eD1t2rnF4k3Bs=
x-served-by
cache-hhn4074-HHN
last-modified
Wed, 24 Jun 2015 07:14:11 GMT
server
AmazonS3
x-amz-meta-s3cmd-attrs
uid:0/gname:root/uname:root/gid:0/mode:33188/mtime:1377415166/atime:1435052450/md5:dfa7b52c86e56bd67fa4002f6ed19854/ctime:1422381567
x-timer
S1582885282.615718,VS0,VE0
etag
"dfa7b52c86e56bd67fa4002f6ed19854"
x-amz-request-id
29D722C296265892
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
72
x-cache-hits
32492
v1
dmx.districtm.io/b/
0
0

54632835-a53e-4604-a2dc-4240cfc1f99e
t.nativendo.de/cds/tracking/event/
0
178 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/54632835-a53e-4604-a2dc-4240cfc1f99e?aid=2s8hs&t=data%2Finventory&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ts=1582885281
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1188
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:20 GMT
via
1.1 google
last-modified
Fri, 28 Feb 2020 10:21:20 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
54632835-a53e-4604-a2dc-4240cfc1f99e
t.nativendo.de/cds/tracking/event/
0
181 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/54632835-a53e-4604-a2dc-4240cfc1f99e?aid=182yo&t=data%2Finventory&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ts=1582885281
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1188
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:20 GMT
via
1.1 google
last-modified
Fri, 28 Feb 2020 10:21:20 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
delayed_impression_vu_fy2019.js
tpc.googlesyndication.com/pagead/js/r20200224/r20110914/elements/html/impression/ Frame FEB0
11 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20200224/r20110914/elements/html/impression/delayed_impression_vu_fy2019.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
10c830a57fdca6052cc30329c51fd036fbee41f9d82ec8b4365553922ea47f9f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Mon, 24 Feb 2020 15:43:59 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
326241
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=":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
4776
x-xss-protection
0
server
cafe
etag
2635775616194047888
vary
Accept-Encoding, Origin
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 09 Mar 2020 15:43:59 GMT
gpt.js
www.googletagservices.com/tag/js/ Frame FEB0
43 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
f533cac6ff0a803d30d57ac75100058f0e3274334cfb7ee639ea0ba4262a2680
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"441 / 710 of 1000 / last-modified: 1582838255"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
14503
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:20 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame FEB0
73 KB
28 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_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
e76ea1aec186a6f4e42cf26dcdb80f5953a73b3a6d8aa2840fef68746bb8f693
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582753860897921"
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
28205
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:20 GMT
5303510603
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5303510603
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.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5303510603
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
pubads_impl_2020022401.js
securepubads.g.doubleclick.net/gpt/ Frame FEB0
167 KB
61 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
6d941ee14efe29bc4859114b4d6c93bd58d9843249a4e9d7603d6f80edb4eadf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 24 Feb 2020 14:08:08 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
62028
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:20 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame FEB0
113 B
178 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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
108
x-xss-protection
0
UnitFeedManagerDesktop.min.js
vidstat.taboola.com/lite-unit/1.0.7/
22 KB
7 KB
Script
General
Full URL
https://vidstat.taboola.com/lite-unit/1.0.7/UnitFeedManagerDesktop.min.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200227-25-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
553b7035c4df88b88b8903f629f83710ec504f6ed8bb06034be2e68383a149da

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
via
1.1 7ed7afde326861e358c3c83359e99895.cloudfront.net (CloudFront), 1.1 varnish
age
268433
x-cache
Miss from cloudfront, HIT
status
200
content-encoding
gzip
content-length
7235
x-served-by
cache-fra19178-FRA
last-modified
Tue, 25 Feb 2020 07:38:06 GMT
server
AmazonS3
x-timer
S1582885282.937734,VS0,VE0
etag
"7df5103f291829252ce9e6c0d4cc60f3"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA6-C1
accept-ranges
bytes
x-amz-cf-id
GYag9xFC7uEZtGGvpJdnbz4sYuuneRVjEB5HMIQpv-E-uGeAHJfqKA==
x-cache-hits
38575
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame E10D
53 B
703 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=7078073696
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.73.48 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Referer
https://videos.giga.de/embed/2006343101
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:21 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
01EDFF38D3375682
Content-Length
53
x-amz-id-2
neRpiWipWYLuTHYyfoS5SiPlqcWm4BQ/5zeFpWdRCcQ+ueghIjBzTsVtf4jcUeWvrQk3uv0y7Jw=
Last-Modified
Fri, 28 Feb 2020 05:24:55 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame E10D
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=8778366887
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
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

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

Response headers

date
Fri, 28 Feb 2020 10:21:20 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
Fri, 28 Feb 2020 10:36:20 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame FEB0
19 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4239789644939934&correlator=3372433528012710&output=ldjh&impl=fif&eid=21062453%2C21065304%2C21065305&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-728x90&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=728x90&eri=6&cookie=ID%3D94d42a64b4ca41ae%3AT%3D1582885280%3AS%3DALNI_MasJ3a9tMLdl8soV0lRepPm_fGz1Q&cdm=www.giga.de&bc=31&abxe=1&lmt=1582885280&dt=1582885280642&dlt=1582885280537&idt=99&ea=0&frm=23&biw=1585&bih=1200&isw=728&ish=90&oid=3&adxs=429&adys=125&adks=4143599050&ucis=9l5qw6vj2kgh&ifi=1&ifk=3893072602&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&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&top=www.giga.de&dssz=8&icsg=42&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=169603703.1582885281&ga_sid=1582885281&ga_hid=1213424474&fws=256&ohw=0&btvi=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
46f190baa08195ca3af1de5ad0962db0ef9e010bf279655d1111781c83b7cb11
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:20 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
7678
x-xss-protection
0
google-lineitem-id
5021208867
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266090691
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_2020022401.js
securepubads.g.doubleclick.net/gpt/ Frame FEB0
66 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
816709e9295a4116a9f1648dcdca148a141e0ee263887b39f474a923380e4310
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 24 Feb 2020 14:08:08 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
24743
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:21 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame FEB0
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

truncated
/ Frame FEB0
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
121a1f31dd6543e5f3d46ed29fa3a92015f80f555f2c1c4235b8d17d4888bd5f

Request headers

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

Response headers

Content-Type
image/png
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame E10D
754 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=8940769030
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.73.19 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-225-73-19.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb

Request headers

Referer
https://videos.giga.de/embed/2006343101
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:06 GMT
Via
1.1 56fad5a50ef67bd961b9722ed0931839.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
25
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
754
Last-Modified
Wed, 22 Jan 2020 03:58:13 GMT
Server
AmazonS3
ETag
"b7cafd7f52366c401d1297c997d1b09d"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA2-C2
Accept-Ranges
bytes
X-Amz-Cf-Id
4vfBWcKiWyOeELOwzUUeGZpv_b_CJYEsuw0_oiflrx9XZrd7ffvJkQ==
Expires
0
/
ssl.1.damoh.giga.de/999647047575ea861c57e02e5480542569499f0f/ Frame E10D
807 B
2 KB
XHR
General
Full URL
https://ssl.1.damoh.giga.de/999647047575ea861c57e02e5480542569499f0f/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
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
AmazonS3 /
Resource Hash
c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed

Request headers

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

Response headers

Date
Fri, 28 Feb 2020 10:21:22 GMT
Connection
keep-alive
Content-Length
807
Last-Modified
Tue, 28 Jan 2020 12:41:45 GMT
Server
AmazonS3
Etag
"c375f889c4e625510890b9eadcb0a3f3"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de34-homad-5
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
view
securepubads.g.doubleclick.net/pcs/ Frame CF7D
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsu7cJSnTHSK-0J2f8XrK8fzoMwTv3I8OMFMXxjtj5AR7ZnPFG6c-NJQMC2BzxCqEiuxzOQk1gso4Y1ePcJd2Jommu_vAVbksMrFWstz0jxzOgohzqY2W88jEQ4NiuImmD_I4M9lrZYAXJWwERewmOZOon9Ie6dcNFpWf00FYGrkyyd-VB_48UwWbvCDPEQ4Al7AO-tp0aILbnYaRzwnI5MiZ9BmgbdwwuVsZCGJBhcFtCZ6ZZgBk4hx1d73WgL96ITtgxDrQPW_0BTMrful8g&sig=Cg0ArKJSzBRj68wpLOZyEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

timing-allow-origin
*
date
Fri, 28 Feb 2020 10:21:20 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
gpt.js
www.googletagservices.com/tag/js/ Frame CF7D
43 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
f533cac6ff0a803d30d57ac75100058f0e3274334cfb7ee639ea0ba4262a2680
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"441 / 543 of 1000 / last-modified: 1582838255"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
14503
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:20 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame CF7D
73 KB
28 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_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
e76ea1aec186a6f4e42cf26dcdb80f5953a73b3a6d8aa2840fef68746bb8f693
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582753860897921"
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
28205
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:20 GMT
5302344717
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5302344717
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.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5302344717
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
pubads_impl_2020022401.js
securepubads.g.doubleclick.net/gpt/ Frame CF7D
167 KB
61 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
6d941ee14efe29bc4859114b4d6c93bd58d9843249a4e9d7603d6f80edb4eadf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 24 Feb 2020 14:08:08 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
62028
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:20 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame CF7D
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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
108
x-xss-protection
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
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.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Fri, 28 Feb 2020 10:21:21 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
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.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Fri, 28 Feb 2020 10:21:21 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame CF7D
19 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3455440122878323&correlator=25834817136441&output=ldjh&impl=fif&eid=21062888%2C21063205%2C21065304%2C21065305&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-300x600&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=120x600%7C160x600%7C300x600&eri=6&cookie=ID%3Dec37b40774c24c40%3AT%3D1582885280%3AS%3DALNI_MYPEpeUwXUV2Mq7ifu-SmEeIQp-8g&cdm=www.giga.de&bc=31&abxe=1&lmt=1582885280&dt=1582885280932&dlt=1582885280794&idt=133&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=3&adxs=1318&adys=125&adks=2714360146&ucis=w45hxs1qvcae&ifi=1&ifk=1567943126&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&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x600&msz=300x600&ga_vid=1176226199.1582885281&ga_sid=1582885281&ga_hid=993457053&fws=256&ohw=0&btvi=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
246a748c3fedfbc12ca0259b5ab8b5654b4b7f81ffdbfff19f9d5b2bf213027e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:21 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
7727
x-xss-protection
0
google-lineitem-id
5021576057
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266369269
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_2020022401.js
securepubads.g.doubleclick.net/gpt/ Frame CF7D
66 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
816709e9295a4116a9f1648dcdca148a141e0ee263887b39f474a923380e4310
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 24 Feb 2020 14:08:08 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
24743
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:21 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame CF7D
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

truncated
/ Frame CF7D
216 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7f4185875bd84924440605027c50aec2e8bd837b9dd90c275595a01955816842

Request headers

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

Response headers

Content-Type
image/png
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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Date
Fri, 28 Feb 2020 10:21:21 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
view
securepubads.g.doubleclick.net/pcs/ Frame 3FD2
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssOBETn54f_L3QudGFNPCDu_8nwpL5LpbUPBmqnZ4bZRiJz9WuYFA8uWLmJX5JGN8nO2apGUzqwE05RAXC3PiHRxjh-ilpj11kyDXH7hr8DPizgzcIOAt5curuhyp_U5QfpGLdEOOm1sjkYaM1tJXPiZwcX790PEK0JJwASKmxKrIt8xBC2FG1_pfMVVtpMpgfibJmTPODSbsQ6UJhXVH3u36cDSwiqxmDJRvCt4XzYQFArAMHiUJDsjbtMNRvlFNbIXqsSUrmBZNi_zFaP9w&sig=Cg0ArKJSzLSLVUZN7tm6EAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

timing-allow-origin
*
date
Fri, 28 Feb 2020 10:21:21 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
gpt.js
www.googletagservices.com/tag/js/ Frame 3FD2
43 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
f533cac6ff0a803d30d57ac75100058f0e3274334cfb7ee639ea0ba4262a2680
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"441 / 744 of 1000 / last-modified: 1582838255"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
14503
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:21 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 3FD2
73 KB
28 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_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
e76ea1aec186a6f4e42cf26dcdb80f5953a73b3a6d8aa2840fef68746bb8f693
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582753860897921"
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
28205
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:21 GMT
5303510597
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5303510597
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.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5303510597
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
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.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Fri, 28 Feb 2020 10:21:21 GMT
pubads_impl_2020022401.js
securepubads.g.doubleclick.net/gpt/ Frame 3FD2
167 KB
61 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
6d941ee14efe29bc4859114b4d6c93bd58d9843249a4e9d7603d6f80edb4eadf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 24 Feb 2020 14:08:08 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
62028
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:21 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 3FD2
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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
108
x-xss-protection
0
ads
securepubads.g.doubleclick.net/gampad/ Frame 3FD2
19 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=110944843121477&correlator=2025219329588565&output=ldjh&impl=fif&eid=21062833%2C21064368%2C21065583%2C21065588%2C21065304&vrg=2020022401&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200228&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-300x250&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=300x250&eri=6&cookie=ID%3D1648125ef8a6a486%3AT%3D1582885280%3AS%3DALNI_Mau_123nP9RB2tqa81h_Unoz1KuUg&cdm=www.giga.de&bc=31&abxe=1&lmt=1582885281&dt=1582885281099&dlt=1582885281005&idt=90&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=250&oid=3&adxs=968&adys=282&adks=3816689529&ucis=7sckeu6ybz5u&ifi=1&ifk=2855988050&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=1753083775.1582885281&ga_sid=1582885281&ga_hid=282127518&fws=256&ohw=0&btvi=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
b59eafb5a2321d7960298052e605dcf7642cbce9b7def89027d7893b380202e4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:21 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
7686
x-xss-protection
0
google-lineitem-id
5021208867
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266090223
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_2020022401.js
securepubads.g.doubleclick.net/gpt/ Frame 3FD2
66 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
816709e9295a4116a9f1648dcdca148a141e0ee263887b39f474a923380e4310
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 24 Feb 2020 14:08:08 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
24743
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:21 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 3FD2
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

truncated
/ Frame 3FD2
214 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d451da75db3f2f7e40b2b960b3cf5489a26e92ff0160ef38acd7db71e013cf56

Request headers

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

Response headers

Content-Type
image/png
5303510603
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5303510603
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.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5303510603
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
activeview
pagead2.googlesyndication.com/pcs/ Frame FEB0
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsscAQCqQh_IlBgLAc7wcoAniGXZ52aUFUBllTtVz_urEcn7NFO30y9y_QHHD0X7Ix6LkERD9aahdLcmoO0BGCwTAR49xzhlVFJHixckvaI&sig=Cg0ArKJSzNaWllEWV-u9EAE&adk=2257154448&tt=-1&bs=1585%2C1185&mtos=1010,1010,1010,1010,1010&tos=1010,0,0,0,0&p=125,429,215,1157&gcm=1&lcs=1&mcvt=1010&rs=0&ht=0&tfs=108&tls=1118&mc=1&lte=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582885280539&dlt&rpt=122&isd=0&msd=0&ext&xdi=0&msp=1&ps=1618%2C4917&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-4-11-11-0-0-0&tvt=1115&is=728%2C90&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=12&upc=0&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200226
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:21 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
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
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 8DC3
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
2973
date
Thu, 27 Feb 2020 15:20:44 GMT
expires
Fri, 26 Feb 2021 15:20:44 GMT
last-modified
Thu, 21 Nov 2019 16:01:11 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
68437
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
osd.js
www.googletagservices.com/activeview/js/current/ Frame FEB0
73 KB
27 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
261a1dfeeccd3f6747dd6bb49e60579c2582910c2b225d23677772825bf7bc3d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582753860897921"
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
27728
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:21 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame D94E
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
2973
date
Thu, 27 Feb 2020 15:20:44 GMT
expires
Fri, 26 Feb 2021 15:20:44 GMT
last-modified
Thu, 21 Nov 2019 16:01:11 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
68437
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
osd.js
www.googletagservices.com/activeview/js/current/ Frame CF7D
73 KB
27 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
261a1dfeeccd3f6747dd6bb49e60579c2582910c2b225d23677772825bf7bc3d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582753860897921"
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
27728
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:21 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame BCF9
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
2973
date
Thu, 27 Feb 2020 15:20:44 GMT
expires
Fri, 26 Feb 2021 15:20:44 GMT
last-modified
Thu, 21 Nov 2019 16:01:11 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
68437
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
osd.js
www.googletagservices.com/activeview/js/current/ Frame 3FD2
73 KB
27 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
261a1dfeeccd3f6747dd6bb49e60579c2582910c2b225d23677772825bf7bc3d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:22 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582753860897921"
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
27728
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:22 GMT
gen_204
pagead2.googlesyndication.com/pagead/ Frame 3FD2
0
49 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&pvsid=110944843121477&r=300x250&w=300&h=250
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:22 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
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
timing-allow-origin
*
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
st
imprammp.taboola.com/ Frame C0FD
0
0
Document
General
Full URL
https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=92479FD575238780325174637002&cicmp=1657475&cijs=1&dast=V7KB4CFgO832lxhTCIDwS832lxhTCIDwUAAAAGBvQHHTkZ7ZYzEmu3mmyGu-FgMxkthpPRaDKZLGZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3Ch6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2a1zWVwvo-Vlt7w8RrvL8tb6PaeX3a23m512l1tleTtNp5fZ7pcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYABUfC_N0Wy8tmc_kDAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENp8MagB-DBB-BBCAAA4GIo9y_JrJMxZoGoILWIEQAAAECudLbd0aROqCyqAAAI0q0ArgAAAuAWoTZTsnQHJd7CAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-akNJFYxrQpM6k2i8gAMDaLyAAAJu6AQC8CcAFXQCsziAmm9FuMjsAAACAu____389kNt4VraJx-VxThbOicm0HHk8FodlY1qtbCvjYrk9BpOrRF2Vdae-EWGZ_b6DgnJ6eswug4zlMhnUAlnT5PIbxAcNw3IyCOY3YYvRajLZLIez5WIyGI6Go9H-BG40wAkaDgeL3WCxWyyGk8VkNFgOFigQgwlOyHC0maxGu9VushxORqPZZrJBilatZqPNYLiaTWa73Wo4GC5HI6RozWI2mSxmo-VuM1hORoPhZDhEGFp5bDbfbuZWeTaOtWi5cbglrt1srZnZRh7TbDAbGTdu0etjeq0ms5ljZsWDOl0c-9qFi4IBUnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WXf23hWtonH5XFOFs6JybQceTwWh2VjWq1sK-NiuS-tPDabbzdzqzwbx1q03DjcEtduttbMbCOPaTaYjYwbt-j1Mb1Wk9nMMfM3VsPJcLia7Jb7xmo4GQ5Xk91y36EzfFefs1F50yo8Qm31Oz2eZKaDwmWweDeq1XH8mRy0ZbPRqRNZvp-N0e_3-_1-v9_v9_sNWs_BbDAoYongdJFORC_j6SKWSJ4W6US4WbgWq43DOFw4Jr6JyTZarVyL5WIw2W0cu4VlIpYoTRfpRK97WRyGw-cveDgPD7Nfc3h5nA6z5y94OA8Ps1vnsrheRsvLbnl5jHaX5a31e04vu1tvNzvtLrfK8naaTi-z3aL-40MMV3PJYjCXLHZzxWK4SgAAAAAAAAAAS5gzbwIAAABwGshiMZgslgsAIca66688yuHNPZdc3PgxxJwuf5fL8ta8LW6d0-cw82Y!&excid=22&tst=1&docw=0&cs=false
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
imprammp.taboola.com
:scheme
https
:path
/st?cipid=8045671&ttype=0&cirid=92479FD575238780325174637002&cicmp=1657475&cijs=1&dast=V7KB4CFgO832lxhTCIDwS832lxhTCIDwUAAAAGBvQHHTkZ7ZYzEmu3mmyGu-FgMxkthpPRaDKZLGZTCDGWy2RQCyQss993UFBOT4_ZZZCxXCaDWiBrmlx-N3Ch6XT4XPd63e931zl9DrvI5de9LA7D4fMXPJyHh9mvObw8TofZ8xc8nIeH2a1zWVwvo-Vlt7w8RrvL8tb6PaeX3a23m512l1tleTtNp5fZ7pcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYABUfC_N0Wy8tmc_kDAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENp8MagB-DBB-BBCAAA4GIo9y_JrJMxZoGoILWIEQAAAECudLbd0aROqCyqAAAI0q0ArgAAAuAWoTZTsnQHJd7CAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-akNJFYxrQpM6k2i8gAMDaLyAAAJu6AQC8CcAFXQCsziAmm9FuMjsAAACAu____389kNt4VraJx-VxThbOicm0HHk8FodlY1qtbCvjYrk9BpOrRF2Vdae-EWGZ_b6DgnJ6eswug4zlMhnUAlnT5PIbxAcNw3IyCOY3YYvRajLZLIez5WIyGI6Go9H-BG40wAkaDgeL3WCxWyyGk8VkNFgOFigQgwlOyHC0maxGu9VushxORqPZZrJBilatZqPNYLiaTWa73Wo4GC5HI6RozWI2mSxmo-VuM1hORoPhZDhEGFp5bDbfbuZWeTaOtWi5cbglrt1srZnZRh7TbDAbGTdu0etjeq0ms5ljZsWDOl0c-9qFi4IBUnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WXf23hWtonH5XFOFs6JybQceTwWh2VjWq1sK-NiuS-tPDabbzdzqzwbx1q03DjcEtduttbMbCOPaTaYjYwbt-j1Mb1Wk9nMMfM3VsPJcLia7Jb7xmo4GQ5Xk91y36EzfFefs1F50yo8Qm31Oz2eZKaDwmWweDeq1XH8mRy0ZbPRqRNZvp-N0e_3-_1-v9_v9_sNWs_BbDAoYongdJFORC_j6SKWSJ4W6US4WbgWq43DOFw4Jr6JyTZarVyL5WIw2W0cu4VlIpYoTRfpRK97WRyGw-cveDgPD7Nfc3h5nA6z5y94OA8Ps1vnsrheRsvLbnl5jHaX5a31e04vu1tvNzvtLrfK8naaTi-z3aL-40MMV3PJYjCXLHZzxWK4SgAAAAAAAAAAS5gzbwIAAABwGshiMZgslgsAIca66688yuHNPZdc3PgxxJwuf5fL8ta8LW6d0-cw82Y!&excid=22&tst=1&docw=0&cs=false
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
t_gid=2a9b8f16-10bb-4096-becd-7fe54b3aaca6-tuct5526f21
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
server
nginx
accept-ranges
bytes
date
Fri, 28 Feb 2020 10:21:21 GMT
via
1.1 varnish
x-served-by
cache-fra19137-FRA
x-cache
MISS
x-cache-hits
0
x-timer
S1582885282.969510,VS0,VE9
content-length
0
view
securepubads.g.doubleclick.net/pcs/ Frame FEB0
0
48 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstwWtoDq8tQ2DevyzuDTn5730yvC4ywq0OYPNXt4g7E8m90HyhwG0eGsnNdLHs-_vc62lC7KN-tyJLnTWVXAapCh62jS8yqmzfayXjyRGuDDcyXSjtTGQilJ9tJc-QXF86nOhQD3oHqem0MkbDhVrdRWyZQ5dGU8Ea-Rve6Rro5wOfRMho8I0GXa1Jg1j2bEgaW23difHZ_IeKZWwctuiNO0BwJHSaztKDPR7Rul2WYVnjbi11tb9inM1xGxNsy8bIKcnGrTARTBWWYbvfP&sig=Cg0ArKJSzNmtthIdZzrJEAE&urlfix=1&cbvp=2&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Fri, 28 Feb 2020 10:21:22 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
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
cache-control
private
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
0
x-xss-protection
0
sodar
pagead2.googlesyndication.com/getconfig/ Frame FEB0
7 KB
5 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020022401&st=env
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
b53efed83257494f94cfafa511ff9d1755ab652239517dc8f994d593f0d7370e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Fri, 28 Feb 2020 10:21:22 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
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
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; 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
5199
x-xss-protection
0
sodar
pagead2.googlesyndication.com/getconfig/ Frame CF7D
7 KB
6 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020022401&st=env
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
f385711a66c1ac4275c8113896dbe6a08b7ff6a18a67c1a69dbf0b86b9edf9b0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Fri, 28 Feb 2020 10:21:22 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
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
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; 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
5143
x-xss-protection
0
sodar2.js
tpc.googlesyndication.com/sodar/ Frame CF7D
14 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:22 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582746470043195"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
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
5456
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:22 GMT
sodar2.js
tpc.googlesyndication.com/sodar/ Frame FEB0
14 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022401.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:22 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582746470043195"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
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
5456
x-xss-protection
0
expires
Fri, 28 Feb 2020 10:21:22 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame CF7D
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsseW5FN4O6xG8hvQezOxmgXC3YwTp-Q1HRVkX57DaekbgYvN238Cyqo4sToQGHaXwW4k9Vsi1204EPQe7mrVV5QIb7UgqNDRxEhWFjpGl4&sig=Cg0ArKJSzEi1VIYSaxMfEAE&adk=2778923653&tt=-1&bs=1585%2C1185&mtos=0,1021,1021,1021,1021&tos=0,1021,0,0,0&p=125,1318,725,1618&mcvt=1021&rs=0&ht=0&tfs=102&tls=1123&mc=0.89&lte=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582885280797&dlt&rpt=143&isd=0&msd=0&ext&xdi=0&ps=1618%2C4917&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-2-11-11-0-0-0&tvt=1123&is=300%2C600&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200226
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:22 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
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
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/ Frame 584D
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/209/runner.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
5727
date
Fri, 28 Feb 2020 09:42:39 GMT
expires
Sat, 27 Feb 2021 09:42:39 GMT
last-modified
Tue, 25 Feb 2020 17:32:01 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
2323
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
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/ Frame 1809
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/209/runner.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
5727
date
Fri, 28 Feb 2020 09:42:39 GMT
expires
Sat, 27 Feb 2021 09:42:39 GMT
last-modified
Tue, 25 Feb 2020 17:32:01 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
2323
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
hic_qos
ssl.1.damoh.giga.de/ Frame E10D
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,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
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

Referer
https://videos.giga.de/embed/2006343101
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:22 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 0387
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ef06576380441a9c17c71d01fd8c9f26bc90ae41fa77d810acf565c8154244e7

Request headers

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

Response headers

Content-Type
text/javascript
activeview
pagead2.googlesyndication.com/pcs/ Frame 3FD2
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuNK0VN1IgdsLigZkjZDka63ykG10l36mMMMs4WafdO3bA12r5XGqhpfIMw_j1gA3AA4XexgwtDX1HPPCkYzMakQeCXfQGPIUhgTjDBd18&sig=Cg0ArKJSzPIEnoNCBEZFEAE&adk=1428895410&tt=-1&bs=1585%2C1185&mtos=1187,1187,1187,1187,1187&tos=1187,0,0,0,0&p=282,968,532,1268&mcvt=1187&rs=0&ht=0&tfs=102&tls=1289&mc=1&lte=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582885281007&dlt&rpt=99&isd=0&msd=0&ext&xdi=0&ps=1618%2C4917&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-11-1-10-10-0-0-0&tvt=1289&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200226
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:22 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
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
gen_204
pagead2.googlesyndication.com/pagead/ Frame CF7D
0
58 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020022401&jk=3455440122878323&bg=!sLOls6tY5D00D_N0-A4CAAAAbFIAAAANmQFd1XdLDsonYFBqnM5s2tCQgPPhQ90hMSz8KBY7Dv4mOsRLz-FoqvLGFd459ImBMuKD5wN0L6vx2FEnYRKUT6e6SuJvgcYDWH8C8MiReT1ssRraT_Q6jjnsYAgfKDXwWhnSAIsohFruY9yOO4TxlSbUud5nym6-GhqpNEwrC8i25Ms0Ekj8q60V92NgOR1tJyJrPuneLwuXHkBd9jQCLtjA543suVk4XCP3sr84eHxaGUEGrEwyTIwWwBMHCC0DhOcjRJC-HXbCro78pn1hNAc2Vw60duo9tLSeDjjSyQUHcHUJ1A-TFMewO-fM51ZPhGjavTv7ZlB-shPmMUhvFx96qlVq0SRKFL2xOv3tnhxvXW0i3-5ChdMb5X5AQ_huC-vvTSCcMEswh7N3VhjGJ5o3CYl7sQzOIzgSAvtoPGSyWTZDH3XuGm1j3kD9NP2pp_6OWFB-vsmNiJuu7wnj0Q
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:22 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
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
timing-allow-origin
*
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
5302344717
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5302344717
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.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:22 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5302344717
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
gen_204
pagead2.googlesyndication.com/pagead/ Frame FEB0
0
58 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020022401&jk=4239789644939934&bg=!VValVk5YkImyQ2VwciUCAAAAeVIAAAAOmQFdBp8rEwoZtED35UgwpxVjsFZeijcRijyCPyM7-Os5eG9svoB5JAgq3qmxBp3LAJwOlBm4qhydTB-NOKDpQeKGYgmqkIk0qSP93AU52dVeKnYJqvrmHzbs_plr7zLkCKtsFER_Qfqoe8KatxoDasr_G5cu_MTvouCyNmZCwb-3wuer29gLQHnz9Crz78ggArNd9CV_w1lnGplLbrjNyixSq40bppAo1Le9UfVPZQLh09F2SVMd3WdN-tbkW0kHV_XbuW0nSpWBLSN-DaeWrU3oLjBp1HiPzuer_UhQqeusNipUsaVVtHfpOEg9DOXbD-n-ur4BMESeHCGBm2QFynLe1O8YhX7A5lDCWYebzHmyjVHgCRGm-T-ef3X5KwHCjplfYcYbhixFi2XL9oRZzB3suCAr-elQAcEaB-65_JZWLPOBzeOAUg9wQo13cyM9dqPkPeRWxDo3JFblfH_tMg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:22 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
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
timing-allow-origin
*
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
/
ssl.1.damoh.giga.de/2ceaaf3091fdc237c46c8d90f24de66ddd70a4ed/ Frame E10D
109 B
671 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/2ceaaf3091fdc237c46c8d90f24de66ddd70a4ed/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBoZVhhaWtpY2h1eGFUYWg9UGhlWGFpa2ljaHV4YVRhaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnhuKWsueWwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsayl9KX1rLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5aaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmspeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8obC5JYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9rLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5jbyhrKTtiLmJvKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGsuQWIubGVuZ3RoKXt2YXIgYj1rLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmxvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09aztmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxrKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5aaz0hMTt0aGlzLk9iPSJzZXR1cCI7dGhpcy5iZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRm4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxtYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxGbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5FbihiLmRhdGEpfSxFbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5UYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuT2woYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy53bChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxhbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sd2w6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGY9YltxXS5zcGxpdCgiOiIpLApkPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGY9ZC5zcGxpdCgiLSIpLGQ9ZlswXSt0aGlzLmFsKGZbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscT0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtxPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHEmJihmPTEwMC9xKmQqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFRiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZT0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZSs9Zy50b1N0cmluZygxNik7cmV0dXJuIGV9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHEsZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsbD0yNzE3MzM4Nzgsaz0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcT1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO3E9YztuPWg7bT16O3k9bDt0PWs7Zm9yKGc9MDsxOT49ZztnKyspcD1kKHEsNSkrKG4mbXx+biZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9MjA7Mzk+PWc7ZysrKXA9ZChxLDUpKyhuXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTQwOzU5Pj1nO2crKylwPWQocSw1KSsobiZtfG4meXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz02MDs3OT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Yz1jK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cmw9bCt5JjQyOTQ5NjcyOTU7az1rK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShsKSthKGspKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHEsZixjLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxxPWIuY2hhckNvZGVBdCh6KyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8cT4+NixoPXEmNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKHEpJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxobDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHE9ITEsZj0hMSxjPSExLGg9ITEsej0hMSxsPSExLGs9ITE7dHJ5e2E9dGhpcy5obCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZ2M/ITA6ITF9Y2F0Y2godCl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxrPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1xO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1sO2IuaXNCbGluaz1rO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17Tmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sU2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxWazpmdW5jdGlvbigpe3JldHVybiBiLk5pKCl8fApiLlVpKCl8fGIud20oKXx8Yi5TaigpfHxiLnhrKCl8fGIuSGooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuVmsoKX0sVWw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGUpe2EmJihkLnF1ZXJ5S2V5W2FdPQplKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxobTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuT2I9Yn0sTWU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5PYjt0aGlzLnVlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnhuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5NZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1sLlRhKGEsZCkpO2EmJih4PWwuVGEoYixhKSk7ZyYmKHg9bC5UYSh4LGcpKTtxJiYoeD1sLlRhKHgscSkpO2MmJih4PWwuVGEoeCxjKSk7aCYmKHg9bC5UYSh4LGMpKTtmLkxjKHgpfSxHbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmhtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5tYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuR24oYik7aWYoYSlpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWsucmMoKTtrLndhKGIsITApO2I9ay53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtrLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFrfHwhay5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihrLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9ay5yYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7ay53YShnLCEwKTtnPWsud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ay5MYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSx2YzpmdW5jdGlvbihiKXtpZigha3x8IWsuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmMoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGsuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWsucmMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9ay53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtrLkxhKGQpfX0samY6ZnVuY3Rpb24oKXtrJiZrLlM/ay5pc0VuYWJsZWQmJmsuaWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLmViKGIsYS5BYSxmLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9CiExfWMudXJsJiZjLmhhc2gmJihjPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuUGsoYyxiKTtyZXR1cm4gY30sZWI6ZnVuY3Rpb24oYixhLGQsZyxmLGMsaCx4KXt2YXIgbD1jfHxrO2M9ITA7eCYmKGM9ITEpO2lmKGwmJmwuUylpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2wud2EoYixjKTtjPWwud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWMuZGF0YVt0XT1kW3RdO3JldHVybiBsLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZCxnLGYsbCxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFRjOmZ1bmN0aW9uKGIsYSxkLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGwgaW4gaClkKz0iJiIrbCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbbF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGs9bmV3IFhNTEh0dHBSZXF1ZXN0O2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWsucmVhZHlTdGF0ZXx8MjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1c3x8ZyhrKTtmJiY0PT1rLnJlYWR5U3RhdGUmJjIwMCE9ay5zdGF0dXMmJjIwMSE9ay5zdGF0dXMmJmYoayl9O3RyeXtrLm9wZW4oYSxiLHgpLGsud2l0aENyZWRlbnRpYWxzPWMsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBrfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5UYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYmQpZm9yKHZhciBjIGluIHRoaXMuYmQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5iZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlVtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmJkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsZil7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxXazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxGaTpmdW5jdGlvbigpe2smJmsuUz9mLnRyYWNrKCJzdGF0c19oZF9wbGF5aW5nX3N1bSIsay5FYiwhMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZpKCl9LmJpbmQodGhpcyksNTAwKX0sRWk6ZnVuY3Rpb24oYil7ayYmay5TP2suRWImJmYudmMoWyJzdGF0c19oZF9lcnJvcmNvZGU6IitiLCJzdGF0c19oZF9lcnJvcmNvZGVfc3VtIl0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FaShiKX0uYmluZCh0aGlzKSw1MDApfX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPQpiW2ddO3JldHVybiBkfTthLnluPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTthLmhuPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVwPXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIiwKbmFtZToiYWRNaWRQb2ludCJ9O2Eudmc9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTthLkhrPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTthLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuYXA9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS52cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2EuS2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07YS51bD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2Eud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5JYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9OwphLnJlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTthLnRlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07YS5Jaz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5sbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudHA9Cntjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlhvPXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Zbz17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGw9Yy5wanx8bDtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYudm09YTthLnByb3RvdHlwZT0Ke319KShjKTt2YXIgamE9Yy52bXx8amE7bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5yaj1hO2EucHJvdG90eXBlPXtUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZyxmO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoZj1iLmxlbmd0aDtkPGY7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxkbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrCiIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLkVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfSx5bTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhKCkrIjIifSx4aDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLlRlKHRoaXMuZG0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fQp2YXIgYj0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87YS5leHRlbmQ9ZnVuY3Rpb24oZSl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZz1PYmplY3QuY3JlYXRlKGQpLGY7Zm9yKGYgaW4gZSlnW2ZdPSJmdW5jdGlvbiI9PT10eXBlb2YgZVtmXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZl0mJmIudGVzdChlW2ZdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGYsZVtmXSk6ZVtmXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2YuWmk9YX0pKGMpO3ZhciBLPWMuWml8fApLO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxhPWMuRmt8fGxhO25ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5NYT17fTt0aGlzLkc9bnVsbDt0aGlzLlljPTEwMDt0aGlzLlViPTA7dGhpcy5WYT0xNTA7dGhpcy4kYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlViPD10aGlzLlZhPyh0aGlzLlViKyssdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSk6MD50aGlzLlZhJiYodGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKSl9LFluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWI+CnRoaXMuVmE/ITA6ITF9LHpmOmZ1bmN0aW9uKCl7dGhpcy5VYj0wfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sZW86ZnVuY3Rpb24oYSl7dGhpcy5HPWF9LGJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sTjpmdW5jdGlvbihhKXt0aGlzLk1hW2Eua2EoKV09YTtMJiZMLkRoJiZMLkFvKGEpfSxmcTpmdW5jdGlvbigpe3JldHVybiBmLlJlKHRoaXMuTWEpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9CnRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLlljPTEwO3RoaXMuVWI9MDt0aGlzLlZhPTUwO3RoaXMuWD1udWxsO3RoaXMuaGE9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLk5iPSIiO3RoaXMuUWc9ITE7dGhpcy5KKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGdxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0saG86ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSxlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVWI8PQp0aGlzLlZhJiYodGhpcy5VYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLHRoaXMuWWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX0seXE6ZnVuY3Rpb24oKXt9LFc6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1hO3RoaXMucW0oKXx8dGhpcy5MaygpO3RoaXMuUWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxocTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApZZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk5iPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmJ9LApZaDpmdW5jdGlvbigpe3RoaXMuTmI9bnVsbH0sanE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLk5iJiYoYT0hMCk7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKCl7dGhpcy5RZ3x8KHRoaXMuUWc9ITApfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy52aWRlb1RhZztiJiZiLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkNrPSIzIjt0aGlzLmhkPTA7dGhpcy5ibj0zMDt0aGlzLmRjPVtdO3RoaXMub2I9W107dGhpcy55Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPQohMTt0aGlzLnN0YXR1cz10aGlzLmhkO3RoaXMuaWQ9Zi5WKDEwKTt0aGlzLkZmKGEpO3RoaXMuZm8oYil9LGY6ZnVuY3Rpb24oKXt9LGphOmZ1bmN0aW9uKCl7dGhpcy53aXx8KHRoaXMud2k9ITAsZi5qZigpKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlIoKTtRJiZRLnBjJiYhbWEmJihtYT0hMCxmLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLm1jKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5tYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubWMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKSxiPSEwLGU9bmV3IEk7d2luZG93W2UuZ2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0mJndpbmRvd1tlLmdhKCldW2Eua2EoKV0uaW5pdGlhdG9yIT1mLm1jKCkmJih0aGlzLkdmKCksYj0hMSk7cmV0dXJuIGJ9LEM6ZnVuY3Rpb24oYSxiKXt2YXIgZT0hMDthJiYoZT0hMSk7aWYoIXRoaXMuemEoKSl7dGhpcy54bSgpO2lmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5kYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5kYyYmMDx0aGlzLmRjLmxlbmd0aCYmCih0aGlzLmRjPWYudW5pcXVlKHRoaXMuZGMpLGYudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLmRjLmpvaW4oIiwiKSkpO2lmKHRoaXMub2Ipe2Zvcih2YXIgZT0wO2U8dGhpcy5vYi5sZW5ndGg7ZSsrKXRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPT10aGlzLnljW2FdJiZiLnB1c2godGhpcy5vYltlXS5kZXRhaWwpLHRoaXMueWNbdGhpcy5vYltlXS5yZWFzb25dPHRoaXMueWNbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy55Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuQ2t9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZH0sb2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLmtnfSx6YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5oZH0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihmKXtmLmZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPWEuUnA7Yj9iLnBhP2IucGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7dmFyIGE9ITEsZz0iIjtiLmdldEVycm9yJiYoYT1iLmdldEVycm9yKCkpO2F8fGIuZGV0YWlsLmdldEVycm9yJiYoYT1iLmRldGFpbC5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZSYmKGcrPWEuZ2V0RXJyb3JDb2RlKCkpO2EuZ2V0TWVzc2FnZSYmKGcrPWEuZ2V0TWVzc2FnZSgpKTtnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KdGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcGE9Yy5nanx8cGE7KGZ1bmN0aW9uKGYpe2YuaGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuTGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkxqfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5uaD10aGlzLnhiPSExO3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YS5hdXRob3JpdHkmJmEuYXV0aG9yaXR5LmluZGV4T2YmJjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnRsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuOwphPXRoaXMudmlkZW9UYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuVChhKX0sTGU6ZnVuY3Rpb24oKXtpZighdGhpcy54Yil7dmFyIGE9dGhpcy5OaCxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fCh0aGlzLnhiPSEwKTt0aGlzLlcoYil9fSxOYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmCjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe2IuZHVyYXRpb24mJmIucG9zaXRpb24mJjE+Yi5kdXJhdGlvbi1iLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LGxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTsKYi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5tZiYmKDAsdGhpcy5tZikoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKCFhLmdldFN0YXRlfHwicGxheWluZyIhPWEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiYKYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxsYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGI9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihiPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQWp8fHNhOyhmdW5jdGlvbihjKXtjLnpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuSGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuc2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLkhiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5IYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkhiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5IYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkhiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7Zm9yKHZhciBkPSJhZFBsYXkgYWRDb21wbGV0ZSBhZENsaWNrIGFkSW1wcmVzc2lvbiBhZE1ldGEgYWRTa2lwcGVkIGFkVGltZSIuc3BsaXQoIiAiKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuSGI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLmkoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpO2Eub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLnphKCkmJih0aGlzLm5hKCksdGhpcy5nZXRQbGF5ZXIoKS50bD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTmI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/CnRoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnNlJiZ0aGlzLmkoKSl9LFltOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuS2U/dGhpcy5LZSsrOnRoaXMuS2U9MTp0aGlzLkplP3RoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy56anx8dGE7KGZ1bmN0aW9uKGMpe2MuQmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWWwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPQpbXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLnhifHx0aGlzLk0oZSl8fHRoaXMuRW0oZSl8fCh0aGlzLk4oZSksZT1uZXcgdGEoZSx0aGlzLkcpLGUuSigpLGUuZigpKX19dGhpcy5QKCl9fSxicTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxZbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQmp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkNsfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2Yuc2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksCmE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFllOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5UYigxMCk7dGhpcy5WZj0hMDt0aGlzLkRjPXRoaXMudWg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmNsKCksdGhpcy56YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuRCgidC1vbmxpbmUuZGUiKT8KITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuSD9hLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLAoiOyIsYS5IJiZhLkguSWE/YS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkgmJmEuSC5JYT90eXBlb2YgYS5ILklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5wZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLAphLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5wYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueWU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJgp0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9CnRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy50aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLlJuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkRjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkVjPSEwO2lmKGYuRCgiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRWM9ITA7Zi5EKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmCmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5FYz0hMDtmLkQoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5FY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxhcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGNsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0sCnpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkRjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGM/dGhpcy53KCk6KHRoaXMuZGEoITApLAp0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnVoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwKKGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGRsOmZ1bmN0aW9uKCl7dGhpcy5KY3x8KHRoaXMuSmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihhLmFkcyl7aWYodGhpcy5KYyE9YS5hZHMuc3RhdGUmJih0aGlzLkpjPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSmM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRsKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYKMTAwOT09dGhpcy5LKXJldHVybiEwO2lmKGYuRCgiZ2lnYS5kZSIpfHxmLkQoInNwaWVsZXRpcHBzLmRlIil8fGYuRCgia2luby5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSl7dmFyIGE9ITE7Zi5UYygiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYil7Yj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVWwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fAoodGhpcy5WZj0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkModGhpcy5WZixmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbmw6ZnVuY3Rpb24oKXt0aGlzLmtxfHwoMTA8dGhpcy5ncD8odGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmdwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuWG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sWG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaHApe3RoaXMuaHA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMucmt8fHlhOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2VdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmCihhPWEucGxheWVyLnBsYXllcigpLGIucHVzaChhKSk7aWYoMDxmLlJlKGIpKXtmb3IodmFyIGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoYT1uZXcgeGEoYltlXSksYS5oYXx8dGhpcy5NKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYSksKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlljKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLkFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5Bbnx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3RoaXMuc2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LEJuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTmIsZT10aGlzLmthKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLnBjJiYoMDw9ZS5pbmRleE9mKGQpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmCmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLlVqfHxSOyhmdW5jdGlvbihmKXtmLlRqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8KHRoaXMuUGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5QYisrLDE1PHRoaXMuUGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sCmVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmYihlLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCnRoaXMuSyk7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMuS2w9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5CbihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihmKXtmLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9CjE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPAphLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9bmV3IFIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgQ2EoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVmp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm1ufHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkRuPQphLnBvc2l0aW9uaW5nO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUud2lkdGg9YS53aWR0aDtlLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZS5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Uuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Uuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuRG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGUpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGIpfXRoaXMuVChlKTt0aGlzLlcoZSk7dGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLkNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DZCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1sOmZ1bmN0aW9uKCl7Zi56aCh0aGlzLkNkKTtmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTsKaWYoZi56aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLk0oYSkpKXt0aGlzLk4oYSk7KG5ldyBJYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy4kYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy4kYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi5Ibj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuSG58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSxNazpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5HaT0hMTt0aGlzLkxoPWQ7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmsmJmsuY2YodGhpcy5GYS51cmwpJiYhYyYmCihjb25zb2xlLmxvZygidGVzdDEiKSxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKSk7ZyYmNCE9aC5yZWFkeVN0YXRlJiZnKGgpfS5iaW5kKHRoaXMpfWMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksayYmay5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTprLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLiRpPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxWbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYiwKYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17QXA6IkFkQ2xpY2tUaHJ1IixDcDoiQWRFcnJvciIsRHA6IkFkU3RvcHBlZCIsR3A6IkFkTGluZWFyQ2hhbmdlIixIcDoiQWRUYWdQYXJzZWQiLEtwOiJBZFZpZGVvQ29tcGxldGUiLE5wOiJBZExvYWRlZCIsT3A6IkFkU2tpcHBlZCIsUHA6IkFkU3RhcnRlZCIsRXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixGcDoiQWRJbXByZXNzaW9uIixCcDoiQWRDcmVhdGl2ZVZpZXciLElwOiJBZFZpZGVvTWlkcG9pbnQiLEpwOiJBZFBhdXNlZCIsTHA6IkFkVmlkZW9TdGFydCIsTXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5sZSxhW2RdKX0sVW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKCl7fSl9aWYodGhpcy5HYSYmdGhpcy5HYS5rZSlmb3IodmFyIGEgaW4gdGhpcy5HYS5rZSl0aGlzLkdhLmtlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuVm4oKTt0aGlzLkdhJiZ0aGlzLlVuKCl9fX0pKGMpO3ZhciBOYT1jLiRpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZmM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5XYj0iIjt0aGlzLmllPQoic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5iYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5YYj0iIjt0aGlzLlliPVtdO3RoaXMuWmI9W107dGhpcy5jZD1bXTt0aGlzLnVjPSIiO3RoaXMuSWI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm9jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMuRWI9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5GYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9CiExO3RoaXMuWmM9dGhpcy5QZD1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmZjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlFjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5XYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLApIT01BRF9BREJMT0NLRVI6dGhpcy5iYyx0ZXN0SGlkZTp0aGlzLlhiLHRlc3RUYWdzOnRoaXMuWWIsdGVzdFRhZ3NKUzp0aGlzLlpiLHRlc3RUYWdzWEhSOnRoaXMuY2QsdGVzdDNQQ29va2llOnRoaXMudWMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm9jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5FYixibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkZjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCwKYWRGYWxsYmFja0NvbmZpZzp0aGlzLmtkLHlpZWxkbGFiOnRoaXMuRGJ9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZmM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJgoodGhpcy5UZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUWM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuV2I9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5iYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuWGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYKKHRoaXMuWmI9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYodGhpcy5jZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudWM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm9jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLkViPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnNkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9CmIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLktmPWIuc2tpcEFsbG93ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxwbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09CiEwfSxabDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuV2soYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIiwKZj0iIixjPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuYmYoYik7Zj10aGlzLmFhKGIpO2c/KHRoaXMuU2MoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucmMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5mY3x8dGhpcy5xZCkmJihoPXRoaXMuZG4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5hbShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhkPWQuZXhlYyhiKSkmJihkWzJdfHxkWzVdKT9hPSEwOnRoaXMuU2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhiKSkmJmRbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFNjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYW06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihkIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2RdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuV3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxyYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYKKGE9ZC5mYWxsYmFjayk7cmV0dXJuIGF9LGNuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgbD1oW0JdLnNwbGl0KCI9Iik7Z1tsWzBdXT1sWzFdfWZvcih2YXIgayBpbiBhW2NdLnN1YnZhbHVlcylnW2tdPXRoaXMuSGgoZ1trXSxrLGFbY10uc3VidmFsdWVzW2tdKTtoPVtdO2ZvcihrIGluIGcpaC5wdXNoKGsrIj0iK2dba10pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9az1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWsucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sZG46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmZjJiYoYj10aGlzLmNuKGIsdGhpcy5mYykpO3JldHVybiBifSxsbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5mbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxmbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEua28oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmpvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxmLGMpe2s9dGhpczt0aGlzLmRmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1kO3RoaXMuY2U9Zzt0aGlzLmpjPWY7dGhpcy55YT1jfHx7fTt0aGlzLmxsKCk7dGhpcy5UbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlJtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5IYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkhjKCl9Y2F0Y2gobCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGQpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSx5bDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sVG06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUWMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMubm0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuSGMoKX0uYmluZCh0aGlzKSwhMCl9LFJtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlRiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChlKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmpjPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5qYz0hMSk7dGhpcy5qYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmpjP3RoaXMuamMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuTGMobC55bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbm06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5XYnx8dGhpcy5BYXx8dGhpcy5IYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxIYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5EKCJ3ZWIuZGUiKXx8Zi5EKCJnbXgubmV0Iil8fGYuRCgiZ214LmF0Iil8fGYuRCgiZ214LmNoIil8fGYuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLldiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5WZT1kLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLldiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucmMoKSksZD10aGlzLmFhKHRoaXMuV2IpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuV2IrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZT1hLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7aWYoIXRoaXMub2MmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm9jPSEwO3RoaXMuVWMoITApOwpyZXR1cm59fWU9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihlPSEwKX1jYXRjaChoKXt9aWYoIShlfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihkLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZC5lbmFibGVkKTt0aGlzLlhiPWQudGVzdGhpZGV8fCIiO3RoaXMuWmI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5jZD1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudWM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5mYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZC5qc3BvcHVwc3x8ITE7dGhpcy5BYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkZjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1kLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm9jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5vYz0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLk9vKCkmJih0aGlzLlhifHx0aGlzLlpifHx0aGlzLllifHx0aGlzLmNkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuR28oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFhtOmZ1bmN0aW9uKGEpe3RoaXMuSGk9ITA7dmFyIGU9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZT10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZSkpLGU9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmUsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihlKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuVGModGhpcy5yYygpLCJQT1NUIixlLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBlPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztlPWUucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGUsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitlKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGUsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy5FYj0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0sRm86ZnVuY3Rpb24oKXtpZih0aGlzLlhiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5iYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuWGIpO2Uuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5YYik7ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpOwphPWR9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlRiKCkpLHRoaXMuS28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLlhkKHRoaXMuYmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5ZYj10aGlzLmNkKSYmdGhpcy5ZYi5sZW5ndGgpe3ZhciBkPXRoaXMuWWIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxLbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2YoKSYmZSgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZCgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5UYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGUuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBlKCl7dGhpcy5YZCh0aGlzLmJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlpiJiZ0aGlzLlpiLmxlbmd0aCl7dmFyIGQ9dGhpcy5aYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LExvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihlLGQpe2Q9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnVjKXRyeXtmLlRjKHRoaXMudWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSWI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixlPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLkViJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5ZaygpO3RoaXMudWMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5JYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLklifSl9LFlrOmZ1bmN0aW9uKCl7dGhpcy5aYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlpjLmlkPWYuVigxMCk7dGhpcy5aYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWmMpO3ZhciBhPXRoaXMuWmMuY29udGVudFdpbmRvdyxlPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5QZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxrbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucG0oKSl7dmFyIGE9dGhpcy5abCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGUsZCxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuR2k9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGdsOmZ1bmN0aW9uKCl7dGhpcy4kbXx8KHRoaXMuJG09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoZz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5TYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChlKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChlKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSxFbzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30saWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuJG8uYmluZCh0aGlzKSx0aGlzLlpvLmJpbmQodGhpcykpfSwkbzpmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbDt0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuSmwoKX0sWm86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5MYyhsLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuQWJbYV07InJlcXVlc3QiPT1lLnR5cGUmJmYuZWIoZS51cmwsZS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1lLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmdhKCldPXRoaXM7Zi5lYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxPbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxUYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPQoiIixkPTA7ZDxhO2QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZX0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPSIiLGQsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGV9LGFhOmZ1bmN0aW9uKGEpe3ZhciBlPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2VbZ11dPWFbZ118fCIiO2QucXVlcnlLZXk9e307ZFtlWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGUpe2ImJihkLnF1ZXJ5S2V5W2JdPWUpfSk7cmV0dXJuIGR9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9IiIsZSxkO2ZvcihlPTc7MDw9ZTtlLS0pZD1hPj4+NCplJjE1LGIrPWQudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChuJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGYsNSkrKG4mcHx+biZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWQoZiw1KSsobl5wXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1kKGYsNSkrKG4mcHxuJnJ8cCZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZChmLDUpKyhuXnBecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2Esaz1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Daj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuQ2p8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMua2M9dGhpcy5yZD0hMTt0aGlzLlVrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuWGs9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5vZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Taz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlhjPXRoaXMuVGQ9ITE7dGhpcy5GaD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLnBjPSExO3RoaXMudmw9Zi5WKDEwKTt0aGlzLlNiPWYuVigxMCk7dGhpcy5RYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy5hYz10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMueGM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Qbz10aGlzLkdiPXRoaXMuUmI9ITE7dGhpcy5CYz1bXTt0aGlzLnFjPXt9O3RoaXMudm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkdjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGU9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZX0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuT2ImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLndvKCk7Zi5vKGwuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxlLGQsZyl7dGhpcy5HYj0KZDt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5rbCgpLGc9ay5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLmFvKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZSxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZSxkKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy5hYz10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5xbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5CYz10aGlzLmFoKGEpO3RoaXMub2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMuam0oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGU9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZT10aGlzLmFoKGIucGFyZW50KSksZS5wdXNoKHRoaXMuVGwoYikpKTtyZXR1cm4gZX0sVGw6ZnVuY3Rpb24oYSl7dmFyIGU9IiIsZD1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2U9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylkLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDplLGNyZWF0aXZlSUQ6ZH19LGptOmZ1bmN0aW9uKGEpe3ZhciBlPVtdLGQ9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGUubGVuZ3RoO2grKylkLnB1c2goYS51YihlW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZT0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGU9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZT1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTplPT1GLm1lLmNvZGU/Zi5vKGwudXAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGU9PUYuaGcuY29kZSYmZi5vKGwuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGwuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnhvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSWImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5JYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhsLmFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8obC52cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhsLndwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8obC5obix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8obC5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8obC5Zbyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMubGMoYSk7dGhpcy5SYSgpfSxsYzpmdW5jdGlvbihhKXt2YXIgZT05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZT1hLmVycm9yLmNvZGUsOTAxPGUmJihlPTkwMCkpO2ZvcihlPXsiW0VSUk9SQ09ERV0iOmV9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLmdmKGQudXJsLGQudHlwZSxlKX1jYXRjaChnKXt9fSxxbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBlPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGU9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1lO2U9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2QmJmQuZW52dmFycyYmKGc9ZC5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRmQmJihnPWQuRmQoKSk7Zy52aWRlb1Nsb3QmJihlPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31lLnZxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihlLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZS5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZS5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5TayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGUudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZS5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZSxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLndmJiZlLmxvYWQoKTtpZih0aGlzLm1pKGUpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGUpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWU6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpfWNhdGNoKGspe3RoaXMudmlkZW89CmV9fWVsc2UgdGhpcy5iLnJsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxvbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnhjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGwuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlJrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVmIoIm11dGVkIiwiY29udGVudCIpO2YubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRix0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5tbSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGsuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRiwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkYsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRiwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5GLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8obC5JYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5uYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5CYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmpwKCksdGhpcy5hLm5jKCEwKSwhdGhpcy5hYykpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5hYz17ZWw6dGhpcy5GLGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8obC5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubmMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5uYyghMCksdGhpcy5ycCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5wcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm9wKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhsLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5GY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMua3AoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnRjKCkpLHRoaXMubHAoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlZiKCJtdXRlZCIsInVzZXIiKSxmLm8obC5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVmIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGwuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGwudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkYsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxrcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnhjPSEwfSxscDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54Yz0hMX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8obC51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8obC50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhsLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHBwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhsLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sb3A6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGU9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Zi5EZSgpO3RoaXMuRj0hMTt0aGlzLlJhKGEpfX0saXA6ZnVuY3Rpb24oYSl7dmFyIGU9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZSYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZT1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZS5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhsLnRwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApOazpmdW5jdGlvbihhLGUpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuU2MoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZChlLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuZnAuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChlLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmtjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2N8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuVWspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlJiJiYhdGhpcy5rYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUmJ8fCh0aGlzLlJiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGUpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuY3AoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuYnAoKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLnZpZGVvLnBsYXkoKTtpZihlJiZlWyJjYXRjaCJdKWVbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5zYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnNjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8obC5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPVtdLGQ9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWQ9Zi5maChhW2ddKSxlLnB1c2goZCk7YT17aGFzaGVzOmV9O2E9bC5UYShhLHRoaXMudSgpKTtmLnVvKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Layh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhsLmxuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkZifHx0aGlzLmIuemMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmtjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZSl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5wYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRmImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIuemMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSxmcDpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmtjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5nbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5wYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhsLkljLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLlNvKGEpO2lmKCF0aGlzLmFjKXt2YXIgZT0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuYWM9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhsLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmUscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLmFjKX1kPSIiO3RoaXMuYi5MZiYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuTGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhsLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkZiPyh0aGlzLmtjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxlLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFNvOmZ1bmN0aW9uKGEpe2YubyhsLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5SYnx8KDA9PWEmJih0aGlzLkdiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLkdiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5JYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSWIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5SYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhsLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGwudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8obC5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhsLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8obC52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGUpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZSwhMCl9LHdvOmZ1bmN0aW9uKCl7Zi52YyhbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YudmMoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtmLnZjKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi52YyhbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFZiOmZ1bmN0aW9uKGEsZSl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZSwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZSl7aWYoIXRoaXMuUmIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5rbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGM9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkdjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGwuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZSl0cnl7dGhpcy5iLlBhPXRoaXMuemwodGhpcy5iLlBhLGEpfWNhdGNoKGspe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZT0iIjt0aGlzLmNnJiYoZT0iX3ZwYWlkIik7dGhpcy5kZCYmKGU9Il93ZWxlY3QiKTtyZXR1cm4gYStlfSxnZjpmdW5jdGlvbihhLGUsZCxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihlPXRoaXMuQS53YShhKSxkJiZlLk1rKGQpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuT2soYSksdGhpcy5BLkxhKGUsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE9rOmZ1bmN0aW9uKGEpe3RoaXMucWNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5xY1thXT0iY2xvc2VkIn0sb2w6ZnVuY3Rpb24oKXt0aGlzLnFjPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZTtmb3IoZSBpbiB0aGlzLnFjKXRoaXMucWMuaGFzT3duUHJvcGVydHkoZSkmJiJvcGVuIj09dGhpcy5xY1tlXSYmYSsrO3JldHVybiBhfSxrbTpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1lfSl9LHpsOmZ1bmN0aW9uKGEsZSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1lfSl9LGNwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy50YygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGUpe31mLm8obC5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRmN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZSl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxicDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBlPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGU9dGhpcy5BLnRkKTtlJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLktiLmJpbmQodGhpcyksMUUzKmUpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sS2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMudmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuU2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy50YygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkxiKCk7dGhpcy5LYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlFiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Sby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5MYigpO3RoaXMuS2IoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZkLmFwcGVuZENoaWxkKGgpO2QuYXBwZW5kQ2hpbGQoYyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuTGIoKTt0aGlzLktiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9IjEwMCUiLGUuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGUuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGUuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLAplLnN0eWxlLmJvdHRvbT0iMHB4IixlLnN0eWxlLnpJbmRleD0iMTAwMDAiLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmUuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGUpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhsLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLkxiKCl9fSxMYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHRjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuU2IpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhsLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlNiKTt0aGlzLnhjPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMueGM9ITEpOihmLm1hKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuTGIoKSx0aGlzLktiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy54Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGwucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5TYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8obC5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwidXNlciIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVmIoIm11dGVkIiwidXNlciIpLGYubyhsLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUWIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5WYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGwuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5RYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlZiKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhsLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxzYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnNjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5zYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEuRWJ8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuT2ImJnRoaXMuVG8oKXx8KHRoaXMueWQ9ITAsdGhpcy5HYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5HYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGU9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixkPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZStkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZT1rLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuWGN8fChhPQohMCxlLmFkRmFsbGJhY2tVUkx8fChlLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkdjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5YY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuR2M/ImFueSI6IiIpKyhlLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5YYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuR2MmJmUuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlhjfSwkbDpmdW5jdGlvbigpe3ZhciBhPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxlPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1lLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZS5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmUuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBlPWsuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuJGwoKTt0aGlzLkdjPXRoaXMuWGM9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBlPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2UsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy52bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlpuKCksdGhpcy5wYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhsLnVsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5GYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5CYyYmMDx0aGlzLkJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5CYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YaysiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5Fa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtlPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy5BYz10aGlzLkNjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGUsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGU9IiI7Yi5xdWVyeUtleSYmKGU9Yi5xdWVyeUtleS5odnApO2UmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmsud2Eoay5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihmLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuRCgiZmFuZG9tLmNvbSIpfHxmLkQoImdpZ2EuZGUiKXx8Zi5EKCJraW5vLmRlIil8fGYuRCgic3BpZWxldGlwcHMuZGUiKXx8Zi5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuRCgiZ2lnYS5kZSIpfHxmLkQoImtpbm8uZGUiKXx8Zi5EKCJzcGllbGV0aXBwcy5kZSIpfHxmLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxsKCl8fG0oKXx8ImFwcHNwb3QiPT1lKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChrLldkKGgpKSsiJnR5cGU9anMiLGI9ay53YShrLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9ay53YShrLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9ay5MYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixlKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk9iKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtlW2JdPXt9fWVsc2UgZS5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBlPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5PYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuT2J8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGsuRW8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZDtlLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWUucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZSk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxlPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1lPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkpuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5XYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGUpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkNjPXRoaXMuUmYoKTt0aGlzLkFjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuV2MoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFdjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxlLHtBZFN5c3RlbTp0aGlzLlNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlZvKCkmJnRoaXMudGYodGhpcy54bCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5DYz8odGhpcy5DYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuV2MoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLkFjPyh0aGlzLkFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLldjKCkpOnRoaXMucGFyZW50LkloKCl9LFZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLk5jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRmI9YS5GYj9hLkZiOnRoaXMuQ2M7YS56Yz1hLnpjP2EuemM6dGhpcy5BYzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3RoaXMucGFyZW50LnRmKGEpfSx4bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk5jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuVmwoKTthLkNxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUmwoKTthLkxmPXRoaXMuaW0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZT0hMTsoZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZlLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLldsKCkpOmEuUGEuY29uY2F0KHRoaXMuZW0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5sYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmxjJiZ0aGlzLnBhcmVudC5sYyhhKSxiPTAsdGhpcy5XYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxsYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5sYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGU9bmV3IFRhKGEsYik7ZS5vcmlnaW49dGhpcztyZXR1cm4gZX0sTW86ZnVuY3Rpb24oKXtyZXR1cm4gYjxlfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5OYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxKbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZSl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFNsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGQ9YVtlXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZCYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZSl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspYi5wdXNoKHtpZDphW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZV0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtlXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2VdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZV0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxYcDphW2VdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2VdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxSbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZT0hMSxkPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZT1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2U9Yn1kLnB1c2goZSk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZCxoPWMpOihiPWUsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGltOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGU9ITEsZD0hMTt0cnl7ZT10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9ZS5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYudG8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5hbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMuemM9dGhpcy5GYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLldqPWE7YS5wcm90b3R5cGU9e3JsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTy5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGNtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGU9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShlPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZS5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2RdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmNtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxtbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk8ubGVuZ3RoO2UrKylpZigwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tlXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuV2p8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMubWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0seHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx5cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLk9tfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWU7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Eanx8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1lO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuZXA9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnpwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy5aaFthXSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ycT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Xbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Qbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzpkLGZyYW1lOmYsd246Yyx2ZW5kb3I6ZS5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMucWYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy5xZltlXTtkLnR5cGU9PT1hJiZkLiRrKHRoaXMuWGwoYSkpfX0sWGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7QXE6ITAsenE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7b3E6InZpZGVvIixEcToianNDdXN0b20iLEVxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRnE6MSxZcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxsbTpmdW5jdGlvbihhKXtmb3IodmFyIGU9MDtlPHRoaXMuYmUubGVuZ3RoO2UrKylpZih0aGlzLmJlW2VdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZV0ud247cmV0dXJuIiJ9LFduOmZ1bmN0aW9uKGEsZSl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5sbShlKSx2ZW5kb3I6ZX0pO3RoaXMudm8oKX0sUG46ZnVuY3Rpb24oYSxlKXsidmlkZW8iPT09YT90aGlzLmVwLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZSl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxlKX0semc6ZnVuY3Rpb24oYSxlKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKJGs6ZSx4cTohMX0pfSx2bzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLnFxKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkJxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLnNtfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuY29uZj1lfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5nYz1bXX1jLmFqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBlPXt9LGQ9ITEsYz0wLGU9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixjPWUubGVmdCxlPWUudG9wKTtmPXt4OmMseTplfTtmLnBvc2l0aW9uPWQ7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBlPTAsZD0wLGM9ITEsZj10aGlzLnVtKGEpLGg9e307YTspZSs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGUrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZSx5OmR9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSxDbzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8obC5JYyx0aGlzLmMubCgpKX0sWm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8obC53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy4kYyYmdGhpcy5jLiRjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxlJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxObDpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmdldFBvc2l0aW9uKGEpO2UucG9zaXRpb24/ZS5wb3NpdGlvbj1lLnBvc2l0aW9uOmUucG9zaXRpb249ImFic29sdXRlIjtlLndpZHRoPWEub2Zmc2V0V2lkdGg7ZS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGV9LG5jOmZ1bmN0aW9uKGEpe3ZhciBlPXRoaXMuTmwodGhpcy50Yik7aWYoZS54IT10aGlzLkhhLnh8fGUueSE9dGhpcy5IYS55fHxlLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxlLndpZHRoIT10aGlzLkhhLndpZHRofHxlLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZS53aWR0aCYmMD09ZS5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1lO3RoaXMuYy4kYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmUueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZS55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1lLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1lLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdGhpcy5nY1thXSh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5nYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5hanx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMudW58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1lKWEuY29udGFpbmVySWQ9ZS5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Qaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmVjPXRoaXMuZWN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTmI7YSYmYS5wYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZT0wO2U8Yi5tb2R1bGVzLmxlbmd0aDtlKyspe3ZhciBkPWIubW9kdWxlc1tlXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuVnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5tcSgpOiExfSxOYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTmMoKTotMX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5lYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmVjfHwzMDI9PXRoaXMuZWM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZWMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5mbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Qanx8Y2I7KGZ1bmN0aW9uKGMpe2MuUmo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy4kai5Eay5Caz93aW5kb3cuT08uJGouRGsuQmsuVHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IGNiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlJqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMucW58fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlNpfHxnYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZT1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxlPWEuZGF0YS5tZXNzYWdlKTtmLkQoIndlbHQuZGUiKSYmIXRoaXMuc24mJih0aGlzLnNuPSEwLGYuRWkoYikpOzEyMDUhPWImJig5MDA9PWImJjA8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRWcoYS5hZEVycm9yRXZlbnRzKTsKYS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe2YuRCgid2VsdC5kZSIpJiYhdGhpcy5ybiYmKHRoaXMucm49ITAsZi5GaSgpKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaGI9Yy5SaXx8aGI7KGZ1bmN0aW9uKGMpe2MuVGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxVaDpmdW5jdGlvbihhKXthPW5ldyBnYihhKTthLmhhP3RoaXMuUCgpOnRoaXMuTShhKXx8KGEuUWQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLk4oYSksKG5ldyBoYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLk1sfHwodGhpcy5NbD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuVWgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlVoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgaWI9Yy5UaXx8aWIsVD1uZXcgaWIodCk7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgamI9Yy5RbHx8amI7bmV3IGpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmtrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LCRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ra3x8VTsoZnVuY3Rpb24oYyl7Yy5qaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3Lm5kKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLnBuKGEpfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpOwp3Lm5kKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5vbSgpfSxwbjpmdW5jdGlvbihhKXt2YXIgYj0iIixlO2ZvcihlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSl7Yj1pc05hTihhW2VdKT8hMTphW2VdO2lmKDEwMDk9PWFbZV18fDEwMDE9PWFbZV18fDMwMz09YVtlXXx8NDAzPT1hW2VdKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2VdKWlmKGFbZV0uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbZV1bZF0pPyExOmFbZV1bZF0sMTAwOT09YVtlXVtkXXx8MTAwMT09YVtlXVtkXXx8MzAzPT1hW2VdW2RdfHw0MDM9PWFbZV1bZF0pKXt0aGlzLncoKTt0aGlzLmphKCk7cmV0dXJufX10aGlzLm0oImFkZXJyb3IiLGIpO3RoaXMuQygpfX0pfSkoYyk7dmFyIFY9Yy5qa3x8VjsoZnVuY3Rpb24oYyl7Yy5saz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0pO3RoaXMuTGQmJihhPWYuQWwoYSx0aGlzLkxkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTShkKSl7dGhpcy5OKGQpO3ZhciBjPW5ldyBWKGQsdGhpcy5HKTtjLmYoKX19Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IoZT1hW2JdO2UucGFyZW50RWxlbWVudDspe3ZhciBlPWUucGFyZW50RWxlbWVudCxoPWUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5MZHx8Cih0aGlzLkxkPVtdKSx0aGlzLkxkLnB1c2goYVtiXSksZD1uZXcgVShoKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksYz1uZXcgVihkLHRoaXMuRyksYy5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxuZDpmdW5jdGlvbihhLGIsZSl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYV18fCh0aGlzLmNhW2FdPXt9KTt0aGlzLmNhW2FdW2JdfHwodGhpcy5jYVthXVtiXT1bXSk7dGhpcy5jYVthXVtiXS5wdXNoKGUpfSxObzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVtiXSl0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGEpLHRoaXMuWW4oKSYmKHRoaXMuemYoKSx0aGlzLmYoKSk7ZWxzZXt2YXIgZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihlPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtiXVtlXSYmMDx0aGlzLmNhW2JdW2VdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2JdW2VdLmxlbmd0aDtkKyspdGhpcy5jYVtiXVtlXVtkXShhKX19LG9tOmZ1bmN0aW9uKCl7aWYodGhpcy5WYylmb3IodmFyIGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5WY1thXSxlPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbZV1bZF0mJjA8dGhpcy5jYVtlXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmNhW2VdW2RdLmxlbmd0aDtjKyspdGhpcy5jYVtlXVtkXVtjXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJncuTm8oYSl9fSl9KShjKTt2YXIga2I9Yy5sa3x8a2Isdz1uZXcga2IodCk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5FbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBsYXkoKX0pfSwKdWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLk9pfHxtYjsoZnVuY3Rpb24oYyl7Yy5QaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5QaXx8bmI7KGZ1bmN0aW9uKGMpe2MuUWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYSYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXt2YXIgZT0KYVtiXSxkPSIiO3RyeXtkPWUuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGMpe2Q9ZS5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgbWIoZCk7dGhpcy5NKGYpfHwodGhpcy5OKGYpLChuZXcgbmIoZix0aGlzLkcpKS5mKCkpfWNhdGNoKGgpe319dGhpcy5QKCl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGUgaW4gdGhpcy5NYSlpZihiPT10aGlzLk1hW2VdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5RaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFiPWMuem58fHFiO25ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy5wbHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSksdGhpcy5wbD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSmcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz1hLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYywhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsCmMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkpnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuTm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmljfHwodGhpcy5pYz1bXSk7dGhpcy5pYy5wdXNoKGEpfSxxbDpmdW5jdGlvbigpe2lmKHRoaXMuaWMmJnRoaXMuaWMubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5pYy5sZW5ndGg7YSsrKXRyeXt0aGlzLmljW2FdKCl9Y2F0Y2goYil7fX0sRmQ6ZnVuY3Rpb24oKXtpZih0aGlzLktjKXJldHVybiB0aGlzLktjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE5uOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuTmp8fHJiOyhmdW5jdGlvbihjKXtjLk1qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5EaT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMuRGkmJih0aGlzLmkoKSx0aGlzLkRpPSEwLHRoaXMubmEoKSk7Yi5VYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSWV8fCh0aGlzLkllPTEpLHRoaXMuSWUrKywxMDA8dGhpcy5JZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTWp8fHNiOyhmdW5jdGlvbihjKXtjLk9qPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7Zi50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgZT0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspZT0KbmV3IHJiKGFbZF0pLHRoaXMuTShlKXx8KHRoaXMuTihlKSwobmV3IHNiKGUsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciB0Yj1jLk9qfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlRrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdmI9Yy52a3x8dmI7KGZ1bmN0aW9uKGMpe2MudWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LExuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMuRGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuTG4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuRGMpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5oYltiXSYmMzAzIT10aGlzLmhiW2JdJiY0MDMhPXRoaXMuaGJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLmphKCk7CmVsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy51a3x8d2I7KGZ1bmN0aW9uKGMpe2Mud2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBlPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuTShlKXx8LTE9PWUuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihlKSwobmV3IHdiKGUsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB4Yj1jLndrfHx4Yix5Yj1uZXcgeGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgemI9Yy5HbHx8emI7bmV3IHpiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmRrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnVmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5DbigpfS5iaW5kKHRoaXMpLDUwMCl9LENuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnVmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LHlvOmZ1bmN0aW9uKCl7dGhpcy51Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuZGt8fEFiOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5abT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMud2N8fCh0aGlzLndjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLndjfHx0aGlzLndjKyssdGhpcy53Yzw9dGhpcy5abT8odGhpcy53YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkueW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuY2t8fEJiOyhmdW5jdGlvbihjKXtjLmVrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBCYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIENiPWMuZWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkZsfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5iaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE5hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5ia3x8RmI7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVWEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnNsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5RbSgpOnRoaXMuR2coKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxzbDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sUW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpiKCk7IWEucGEmJmEuWSYmYS5TcCYmYS5VcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEdnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgZTthOnthPWEuZ2V0RXJyb3IoKTtmb3IoZSBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtlXSl7ZT1hW2VdO2JyZWFrIGF9ZT12b2lkIDB9MTAwOT09ZXx8MzAzPT1lfHw0MDM9PQplPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGUpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5KYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5VYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sbnE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSmIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuYWt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0samw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IEdiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmpsKGFbYl0pO3RoaXMuUCgpfX0pO2MuZ2QuSmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBkPQpiW2VdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWJbZV0mJmJbZV0uZmVybW9kJiZhLnB1c2goYltlXS5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbZV0mJmJbZV0ucGFyZW50RWxlbWVudCYmYltlXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbZV0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy52anx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sJGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLkpqfHxYOyhmdW5jdGlvbihjKXtjLklqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnZmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMudmY9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGU9YS5wbGF5ZXJDb250YWluZXI7ZSYmdGhpcy52ZiYmZSE9dGhpcy52Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLkQoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLnNxKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSWp8fFk7KGZ1bmN0aW9uKGMpe2MuS2o9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLAplPWIubGVuZ3RoLGQ9MDtkPGU7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLnpmKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IFkoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBHLEtiPWMuS2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5ZaXx8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubWo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxlPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksZT1hLkdldEVsKCksYiYmZT8odGhpcy5UKGUpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5tanx8TmI7KGZ1bmN0aW9uKGMpe2MubGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxCZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuaGFuZGxlRXJyb3IoYltlXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLmxqfHxPYjsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgTmIoYVtiXSk7ZS5oYXx8dGhpcy5NKGUpfHwodGhpcy5OKGUpLChuZXcgT2IoZSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFBiPWMubmp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmJqfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGU9ITE7YT8oZT1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZlPyh0aGlzLlQoZSksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sa246ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuVml8fFNiOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy5XaXx8VGI7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGU9bmV3IFNiKGFbYl0pO2UuaGF8fHRoaXMuTShlKXx8KHRoaXMuTihlKSx3aW5kb3cuYnJpZHBsYXllcj1lLChuZXcgVGIoZSx0aGlzLkcpKS5mKCkpfX10aGlzLlAoKX19KX0pKGMpO3ZhciBVYj1jLlhpfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMubm58fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSwkZDpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LE1uOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuemt8fFhiOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmhjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0saGM6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkdrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuR2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmhjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuUW4oKX0sUW46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5oYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5Lbj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5Lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmhjKGEpKX19KX0pKGMpO3ZhciBZYj1jLnlrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhLk1uKCksYT1uZXcgWWIoYSx0aGlzLkcpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMuQWt8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5kanx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2V8fChlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtlPyh0aGlzLlcoZSksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5lbj1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW59LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlpkKGEpfS5iaW5kKHRoaXMpKX0sWmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5va3x8TjsoZnVuY3Rpb24oYyl7Yy5uaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuTmUpaWYodGhpcy5QYnx8Cih0aGlzLlBiPTApLHRoaXMuUGIrKywxNTx0aGlzLlBiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLm1vKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx5YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5LPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT0KYS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXSYmYVtjXS5hZEVycm9yJiZhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2NdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMubmt8fE87KGZ1bmN0aW9uKGMpe2MucGs9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuemYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBiYz1jLnBrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5janx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ganx8WjsoZnVuY3Rpb24oYyl7Yy5Faj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuVGIoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy56YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx6YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRWp8fGFhOyhmdW5jdGlvbihjKXtjLkdqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IGFhKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGVjPWMuR2p8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLlBtfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLmpqfHxoYzsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5GZygpfSxGZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMuaWp8fAppYzsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuUCgpO3JldHVybn1pZighdGhpcy5NKGEpKXt0aGlzLk4oYSk7KG5ldyBpYyhhLHRoaXMuRykpLmYoKTt0aGlzLlAoKTtyZXR1cm59fXRoaXMuUCgpfX0pfSkoYyk7dmFyIGpjPWMua2p8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLkJsfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLkppfHxtYzsoZnVuY3Rpb24oYyl7Yy5JaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5BZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5BZS5iaW5kKHRoaXMpLDEwMCl9LEFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5JaXx8bmM7KGZ1bmN0aW9uKGMpe2MuS2k9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxUYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLlAoKTp0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBuYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5QKCl9fSl9KShjKTt2YXIgb2M9Yy5LaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuaGt8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5OZD1bXTt0aGlzLnlmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy5Zaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmdtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnlmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy55ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5OZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxnbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy55ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxBbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV0uJGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5OZFthXS4kYil9fX0pKGMpO3ZhciByYz0KYy5Zanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy50bnx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGwuV28pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGwuam4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTWUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5EbHx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLk1iPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi53YigibmV3QWRkZWxpdmVyeSIpfWMuTGk9YTthLnByb3RvdHlwZT17aW86ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApjbzpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LGJvOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LGFkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnptKCkpdGhpcy5NYi5nKHRoaXMuTWIuUWMsdGhpcy5NYi5xYSx0aGlzLk1iLnhmLGZ1bmN0aW9uKCl7dGhpcy5hZChhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTWIuamMpO2Vsc2UgaWYoay5EYiYmIWsuSGkpay5YbShmdW5jdGlvbigpe3RoaXMuYWQoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhsLkljLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5DbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLndiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTWIsaCk7bS4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmZmJiYoZD10aGlzLnBsYXllci5mZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5oZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx6bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LHNvOmZ1bmN0aW9uKCl7Zi53YigicHJlcm9sbCIpO2YuRWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuYWQoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX0scm86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRWYoInBvc3Ryb2xsIik7Zi53YigicG9zdHJvbGwiKTt0aGlzLmlvKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLmFkKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8obC53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxUbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBvKHRoaXMucm8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sU2Q6ZnVuY3Rpb24oYSl7Zi53YigibWlkcm9sbCIpO2YuRWYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy5hZChjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8obC53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxTbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmhvKHRoaXMuU2QuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGYoKX0sZjpmdW5jdGlvbigpe3RoaXMuc28oKTt0aGlzLnBsYXllci5sZiYmdGhpcy5TbigpO3RoaXMuVG4oKX19fSkoYyk7dmFyIGZhPWMuTGl8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy5pa3x8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFBoZVhhaWtpY2h1eGFUYWgsUGhlWGFpa2ljaHV4YVRhaCk7Cg==
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
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

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

Response headers

Date
Fri, 28 Feb 2020 10:21:22 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
submit
lb95.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb95.s400.meetrics.net/bb-mx/submit?/+spDBWAAA/whFcBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFvzEwlFjpFhsFzvBwhF5wFhsFtnEliF1lFoyFluFylFjoFulFytBrvFz0FluFtvEusFpuFltBlyFtpF00FlsFuvBfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwS1MBPAAAAAAAAAOAAAAGBAAAAAAZwS1MBBRksFAQtjFqHoATA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:22 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Fri, 28 Feb 2020 10:21:21 GMT
data
lb95.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb95.s400.meetrics.net/data?/+spDCXAAATkzFARksFAQtjFLtJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:22 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 28-Feb-20 10:21:21 GMT
nuggad
ih.adscale.de/
49 B
282 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=2&d10=1&d2=4&d4=3&d11=3&d8=1&d9=2&d12=3&d1=1&d3=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.57.195.246 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-195-246.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

status
200
date
Fri, 28 Feb 2020 10:21:22 GMT
server
Apache-Coyote/1.1
p3p
CP=NOI PSA OUR
content-length
49
content-type
image/gif
container
tracking.m6r.eu/pixel/
Redirect Chain
  • https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=2&n42=1&n116=0&n104=1&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n125=0&n8=1&n2=4&n137=0&n...
  • https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=2&n42=1&n116=0&n104=1&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n125=0&n8=1&n2=4&n137=0&n...
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=2&n42=1&n116=0&n104=1&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n125=0&n8=1&n2=4&n137=0&n101=1&n108=0&n54=0&n110=1&n87=1&n149=0&n76=1&n66=0&n139=0&n160=0&n107=0&n21=1&n40=1&n51=1&n117=5&n86=0&n147=4&n64=0&n119=3&n22=1&n18=1&n161=0&n126=0&n92=3&n62=1&n57=1&n77=1&n83=0&n102=0&n105=0&n159=0&n20=1&n80=1&n12=3&n141=0&n157=0&n26=1&n99=0&n128=1&n73=1&n118=3&n85=0&n9=3&n6=1&n63=1&n58=1&n138=0&n140=0&n94=2&n111=0&n136=1&n79=1&n93=2&n90=0&n142=0&n7=2&n103=1&n158=1&n124=0&n75=1&n91=0&n114=0&n69=0&n10=3&n3=1&n82=1&n33=1&n59=1&n84=1&n5=1&n109=0&n122=2&n67=2&n115=1&n89=1&n123=1&n17=1&n78=0&n81=0&n88=0&n39=1&n156=1&n148=0&n132=4&n133=1&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
145a92b6ac8f7e283ca3f55fb6f0081e4c38cb4a4dfc81b4cbb2ba2ddc336340

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:22 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1514

Redirect headers

Location
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=2&n42=1&n116=0&n104=1&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n125=0&n8=1&n2=4&n137=0&n101=1&n108=0&n54=0&n110=1&n87=1&n149=0&n76=1&n66=0&n139=0&n160=0&n107=0&n21=1&n40=1&n51=1&n117=5&n86=0&n147=4&n64=0&n119=3&n22=1&n18=1&n161=0&n126=0&n92=3&n62=1&n57=1&n77=1&n83=0&n102=0&n105=0&n159=0&n20=1&n80=1&n12=3&n141=0&n157=0&n26=1&n99=0&n128=1&n73=1&n118=3&n85=0&n9=3&n6=1&n63=1&n58=1&n138=0&n140=0&n94=2&n111=0&n136=1&n79=1&n93=2&n90=0&n142=0&n7=2&n103=1&n158=1&n124=0&n75=1&n91=0&n114=0&n69=0&n10=3&n3=1&n82=1&n33=1&n59=1&n84=1&n5=1&n109=0&n122=2&n67=2&n115=1&n89=1&n123=1&n17=1&n78=0&n81=0&n88=0&n39=1&n156=1&n148=0&n132=4&n133=1&checkcookies=true
Date
Fri, 28 Feb 2020 10:21:22 GMT
Server
nginx
Connection
keep-alive
Content-Length
776
Content-Type
text/plain; charset=utf-8
ForumViewTopicContentAD.Cj3s-YOGFGen4.png
www.giga.de/special/gutscheine/
71 B
273 B
Image
General
Full URL
https://www.giga.de/special/gutscheine/ForumViewTopicContentAD.Cj3s-YOGFGen4.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx / TSAdServer
Resource Hash
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Fri, 28 Feb 2020 10:21:22 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
x-robots-tag
noindex, nofollow
content-length
71
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b5f4eda2b77643c9c5113440df20e9f3&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db5f4eda2b77643c9c5113440df20e9f3%2...
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b5f4eda2b77643c9c5113440df20e9f3&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db5f4eda2b77643c9c5113440df20e9f3%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b5f4eda2b77643c9c5113440df20e9f3&userId=adscale-user:523ad0eff17d461f9bbc2c326b3b34ed
44 B
574 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b5f4eda2b77643c9c5113440df20e9f3&userId=adscale-user:523ad0eff17d461f9bbc2c326b3b34ed
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:22 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

status
307
date
Fri, 28 Feb 2020 10:21:22 GMT
server
Apache-Coyote/1.1
content-length
0
location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b5f4eda2b77643c9c5113440df20e9f3&userId=adscale-user:523ad0eff17d461f9bbc2c326b3b34ed
p3p
CP=NOI PSA OUR
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=tfTtord2Q8nFETRA3yDp8w
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
569 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.42.216 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-42-216.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Fri, 28 Feb 2020 10:21:22 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:22 GMT
server
HTTP server (unknown)
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
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
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
260
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
5303510597
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5303510597
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.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 28 Feb 2020 10:21:23 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5303510597
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
index.html
cdn.districtm.io/ids/ Frame AF23
0
0
Document
General
Full URL
https://cdn.districtm.io/ids/index.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.190.66 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

:method
GET
:authority
cdn.districtm.io
:scheme
https
:path
/ids/index.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
date
Fri, 28 Feb 2020 10:21:24 GMT
content-type
text/html
set-cookie
__cfduid=dbf247b222194f063d41c069d925ee4e81582885284; expires=Sun, 29-Mar-20 10:21:24 GMT; path=/; domain=.districtm.io; HttpOnly; SameSite=Lax
cf-ray
56c1abe14df7c83b-AMS
cache-control
s-maxage=1209600, max-age=14400
last-modified
Thu, 10 Jan 2019 16:50:48 GMT
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-cache-status
DYNAMIC
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
server
cloudflare
content-encoding
br
showad.js
ads.pubmatic.com/AdServer/js/ Frame EDA6
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
23.210.249.92 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-210-249-92.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) /
Resource Hash

Request headers

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

Response headers

Last-Modified
Tue, 04 Feb 2020 05:12:07 GMT
ETag
"13006b6-9f85-59db914d12ccf"
Server
Apache/2.2.15 (CentOS)
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
14955
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=90987
Expires
Sat, 29 Feb 2020 11:37:51 GMT
Date
Fri, 28 Feb 2020 10:21:24 GMT
Connection
keep-alive
Vary
Accept-Encoding
pd
u.openx.net/w/1.0/ Frame 3B46
Redirect Chain
  • https://u.openx.net/w/1.0/pd
  • https://u.openx.net/w/1.0/pd?cc=1
0
0
Document
General
Full URL
https://u.openx.net/w/1.0/pd?cc=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, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.176.2 /
Resource Hash

Request headers

:method
GET
:authority
u.openx.net
:scheme
https
:path
/w/1.0/pd?cc=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
i=cd3497b2-78d3-4444-8c85-ad6a6727e3ef|1582885284
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
vary
Accept, Accept-Encoding
set-cookie
i=cd3497b2-78d3-4444-8c85-ad6a6727e3ef|1582885284; Version=1; Expires=Sat, 27-Feb-2021 10:21:24 GMT; Max-Age=31536000; Secure; Domain=.openx.net; Path=/; SameSite=None pd=v2|1582885284|mOgikimWiygu; Version=1; Expires=Sat, 14-Mar-2020 10:21:24 GMT; Max-Age=1296000; Secure; Domain=.openx.net; Path=/; SameSite=None
server
OXGW/16.176.2
p3p
CP="CUR ADM OUR NOR STA NID"
date
Fri, 28 Feb 2020 10:21:24 GMT
content-type
text/html
content-length
374
content-encoding
gzip
via
1.1 google
alt-svc
clear

Redirect headers

status
302
set-cookie
i=cd3497b2-78d3-4444-8c85-ad6a6727e3ef|1582885284; Version=1; Expires=Sat, 27-Feb-2021 10:21:24 GMT; Max-Age=31536000; Secure; Domain=.openx.net; Path=/; SameSite=None
server
OXGW/16.176.2
p3p
CP="CUR ADM OUR NOR STA NID"
location
https://u.openx.net/w/1.0/pd?cc=1
date
Fri, 28 Feb 2020 10:21:24 GMT
content-length
0
via
1.1 google
alt-svc
clear
data
lb95.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb95.s400.meetrics.net/data?/+spDDJOBAKktFLkqFFlqwF23A52AwwATkzFARksFAQtjF/+XNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:27 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 28-Feb-20 10:21:26 GMT
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1582885289643&__it=-60&__ic=727391&__iq=f697e9c47092634dbb44e07a137172f6&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:29 GMT
Last-Modified
Sat, 20 Feb 2010 10:20:48 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
Fri, 22 Feb 2013 10:20:48 GMT
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1582885293104&ns_c=UTF-8&cv=3.5&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga....
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1582885293104&ns_c=UTF-8&cv=3.5&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga...
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1582885293104&ns_c=UTF-8&cv=3.5&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&c9=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.43.115.95 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-43-115-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:33 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=1582885293104&ns_c=UTF-8&cv=3.5&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&c9=
Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:33 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
/
track.adform.net/Serving/Cookie/
73 B
494 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.486310280f148d9827ab2af608ead7d9.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:33 GMT
content-encoding
gzip
server
nginx
access-control-allow-origin
*
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
strict-transport-security
max-age=31536000; includeSubDomains
content-type
text/javascript; charset=utf-8
content-length
180
expires
-1
f9b17833-d68c-4e4d-b319-d6061d45aa9f
boot.pubstack.io/v1/tag/
1 KB
837 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.486310280f148d9827ab2af608ead7d9.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.49.69.125 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-49-69-125.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
22f8fc3249ad9593e80fb8ecda9d9ce5f1372544c48ee9747a5b0fdec4c03251

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

status
200
date
Fri, 28 Feb 2020 10:21:33 GMT
cache-control
private, max-age=120
content-encoding
gzip
content-length
718
content-type
application/javascript
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
22 KB
22 KB
Fetch
General
Full URL
https://gocp.stroeermediabrands.de/absconf/www.giga.de/config.json?c=1582885293
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
c2088d78cab052f661280ebe9df7a1d0d3c3f0c8fcf0e16aa03868b35c1815d9

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Fri, 28 Feb 2020 10:21:33 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Transfer-Encoding
chunked
Content-Type
application/json; charset=UTF-8
tr
www.facebook.com/
44 B
248 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f12d:83:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Fri, 28 Feb 2020 10:21:33 GMT, Fri, 28 Feb 2020 10:21:33 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-24=":443"; ma=3600
content-length
44
expires
Fri, 28 Feb 2020 10:21:33 GMT
t.png
gocp.stroeermediabrands.de/
98 B
355 B
Image
General
Full URL
https://gocp.stroeermediabrands.de/t.png?title=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&contentPieceId=2762322&publishDate=2016-05-25T18%3A29%3A51%2B02%3A00&_=1582885293195.-1413964148
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

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Date
Fri, 28 Feb 2020 10:21:33 GMT
Last-Modified
Mon, 20 Jan 2020 08:33:39 GMT
ETag
"5e2565e3-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Content-Length
98
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.486310280f148d9827ab2af608ead7d9.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
.QpYJyF1nNEXAiEv_p5HZ8WppyW2y5XH
Content-Encoding
gzip
Last-Modified
Thu, 13 Feb 2020 21:01:42 GMT
Server
AmazonS3
x-amz-request-id
9B32B75C27F07F0F
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Fri, 28 Feb 2020 10:21:33 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
hscxyObG6qWgSWOFPIofKO0YsVPDLwFgmHVk/3p+wXbrrSbEljBSY48dqfe9NYmIK0JrbM8LUdI=
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=27312173
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.486310280f148d9827ab2af608ead7d9.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.117 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
5318e6f99439de8be22212f030c069a25e38feb81952f4fed93121eed1aef3b4

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:33 GMT
content-encoding
gzip
last-modified
Thu, 16 Jan 2020 08:30:05 GMT
server
nginx
etag
W/"5e201f0d-9d13"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Fri, 28 Feb 2020 10:26:33 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
0
316 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.486310280f148d9827ab2af608ead7d9.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
194.213.222.29 Hrusovany u Brna, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn4.bbmedia.cz
Software
ibillboard /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Fri, 28 Feb 2020 10:21:33 GMT
Last-Modified
Thu, 27 Feb 2020 10:42:23 GMT
Server
ibillboard
ETag
"5e579d0f-0"
Content-Type
application/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
0
Expires
Thu, 05 Mar 2020 11:47:01 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.486310280f148d9827ab2af608ead7d9.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.171.36.151 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-171-36-151.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
c66d3c57676253019cfd4315afeead909efc06b27b54a85a6debce549fb1f53e

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

status
200
date
Fri, 28 Feb 2020 10:21:33 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
1711
content-type
text/javascript
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.486310280f148d9827ab2af608ead7d9.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:21f3:c400:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 02:37:45 GMT
via
1.1 216b2e0a8a27f8fca1b540a1c4ea6922.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
34953
etag
"f53f55cbab099be3a970b446a66c496a"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA2-C2
accept-ranges
bytes
content-length
3167
x-amz-cf-id
PzJ-CHP288UrsmYTsVPntpC8V_bFUr9ltlKb-e6vvwHorFiEBYpR8Q==
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
581 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=67190514&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, US),
Reverse DNS
175.238.186.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:33 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
monitoring.js
acdn.prod.pubstack.io/
61 KB
19 KB
XHR
General
Full URL
https://acdn.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_256_GCM
Server
2620:1ec:bdf::10 , United States, ASN8068 (MICROSOFT-CORP-MSN-AS-BLOCK, US),
Reverse DNS
Software
Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 /
Resource Hash
b194e718570b321359cdb523a5ed73b7c396150aaffdc5fece2a3e7659c12605

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-ms-blob-type
BlockBlob
date
Fri, 28 Feb 2020 10:21:33 GMT
content-encoding
br
x-azure-ref-originshield
0VehYXgAAAAAp89rIbz8+SJBBOMzMlV8ZQU1TRURHRTA2MTQAMWQ5ZWE5NzctYWI2Ny00N2M3LTkzYTUtMzIzYzA3MDkwMTQy
content-md5
UzyJB/BhpVSBGTVPrGrz9g==
x-cache
TCP_HIT
status
200
x-ms-lease-state
available
x-ms-lease-status
unlocked
last-modified
Wed, 11 Dec 2019 09:47:01 GMT
server
Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
etag
"0x8D77E1F12B2C8B0"
x-azure-ref
0relYXgAAAABnuqaCitajRardb4x93aOlRlJBRURHRTEwMTYAMWQ5ZWE5NzctYWI2Ny00N2M3LTkzYTUtMzIzYzA3MDkwMTQy
content-type
application/javascript
access-control-allow-origin
*
x-ms-request-id
c62d8d7e-301e-016b-721e-ee2dd5000000
cache-control
public, max-age=3600
x-ms-version
2014-02-14
accept-ranges
bytes
map
ih.adscale.de/ Frame 1F5D
Redirect Chain
  • https://ih.adscale.de/map?ssl=1&format=video
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=b7d849918f93436892a3bcd428b9928b
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=b7d849918f93436892a3bcd428b9928b
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.57.195.246 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-195-246.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

:method
GET
:authority
ih.adscale.de
:scheme
https
:path
/map?ssl=1&format=video&nut&uu=b7d849918f93436892a3bcd428b9928b
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
uu=b7d849918f93436892a3bcd428b9928b
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
date
Fri, 28 Feb 2020 10:21:33 GMT
content-type
text/html;charset=ISO-8859-1
content-length
2214
server
Apache-Coyote/1.1
set-cookie
tu=4#3135372239#101~~439690~439690~1#38~~439690~439690~1#72~~439690~439690~1#42~~439690~439690~1#75~~439690~439690~1#60~~439690~439690~1#108~~439690~439690~1#63~~439690~439690~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None

Redirect headers

status
302
date
Fri, 28 Feb 2020 10:21:33 GMT
content-length
0
location
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=b7d849918f93436892a3bcd428b9928b
server
Apache-Coyote/1.1
set-cookie
uu=b7d849918f93436892a3bcd428b9928b; Domain=.adscale.de; Expires=Thu, 25-Feb-2021 02:48:13 GMT; Path=/
launcher.js
sak.userreport.com/sdm/
64 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/3801ce6d-e2fc-4372-aad7-038e2babe3dd/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.194.102 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-224-194-102.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
60fa9d34d5e1b7d6bf0e337cb4aa62f40bcbd6948a2566632b82dac7f18fe5b0

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
TTH5AVswmh9VIwsPLuO8uCQ7VUZecyOr
content-encoding
gzip
last-modified
Wed, 12 Feb 2020 11:21:28 GMT
server
AmazonS3
age
12
date
Fri, 28 Feb 2020 10:21:26 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=7200, s-maxage=60
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
e_ZqX9GICTwd00AljpGR-hQk2aDQDWg2qvt8XwUFjjLf6_PASc_UjQ==
via
1.1 c7f7b4cf7fd5efe64bac95586db3f62b.cloudfront.net (CloudFront)
p.min.js
cdn.emetriq.de/adp/profiling/0.2.25/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.25/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:9000:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
fda97ec20907646eef81309463a8f352dd07cb189eabb717c66fc1757c8c6f3f

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 21 Feb 2020 07:46:09 GMT
content-encoding
gzip
last-modified
Fri, 21 Feb 2020 07:34:56 GMT
server
AmazonS3
age
614125
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
5FyQWcxtGpTx80dn9lJhhCWeIQOZ27ta
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
4faLab8VRDUDwoqwuPeMeXF3u2tYIrtWiHdfDU61uwDaAx8gdihuDw==
via
1.1 286eb4b50e0acf373dd03645aee00b7f.cloudfront.net (CloudFront)
/
d.agkn.com/iframe/8613/ Frame 1B31
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=907326429&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22gdpr%22%3A%22%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
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20eb:7200:19:fc2c:a140:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

:method
GET
:authority
d.agkn.com
:scheme
https
:path
/iframe/8613/?che=907326429&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22gdpr%22%3A%22%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
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
content-type
text/html;charset=UTF-8
content-length
481
cache-control
no-cache, must-revalidate
date
Fri, 28 Feb 2020 10:21: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%3AvW1MqMnn5hv8tlWMuChPO%2Fe458ic2UyJ;Path=/;Domain=agkn.com;Max-Age=31536000;SameSite=None;Secure u=C|0AEAl66YtJeumLQAAAAAAAg1RAQCADVIBAIA;Path=/;Domain=agkn.com;Max-Age=31536000;SameSite=None;Secure
x-cache
Miss from cloudfront
via
1.1 5a5b94c62ea85e0c0d78b169589b08b5.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
rXCVPc7EmrMqvTrVs6vWmdOY0284zu9HtF_ccaywreu8vjgk8oztcA==
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=480b4494fe340ce3569442613ff79465&event_id=page_view&_sid=69511&_ver=0.2.25&_seg=jsonp&_=328882951235
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.25/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.171.36.151 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-171-36-151.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
9a6a842a71b24ad396f378acc12f6ef11455a9134f251abc76b16c22a63d81b8

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 28 Feb 2020 10:21:33 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
status
200
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
adrtxtag.min.js
cdn.adrtx.net/
840 B
849 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.154.128.203 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-154-128-203.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Mon, 24 Feb 2020 18:24:13 GMT
Content-Encoding
gzip
Last-Modified
Mon, 24 Feb 2020 18:01:32 GMT
Server
akka-http/10.1.11
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 BA4D
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa3BDJ3WS7ZBsasBDUkWsfABifABSfABSfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4219359112066865229
42 B
660 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4219359112066865229
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.164.155 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Fri, 28 Feb 2020 10:21:33 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif

Redirect headers

pragma
no-cache
date
Fri, 28 Feb 2020 10:21:33 GMT
server
nginx
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4219359112066865229
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
status
307
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
error
intake.prod.pubstack.io/v1/intake/
0
178 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.30.80.108 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-30-80-108.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Access-Control-Request-Method
POST
Origin
https://www.giga.de
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Access-Control-Request-Headers
content-type

Response headers

status
204
date
Fri, 28 Feb 2020 10:21:33 GMT
access-control-allow-origin
*
access-control-allow-headers
Origin,Content-Length,Content-Type
access-control-max-age
43200
access-control-allow-methods
GET,POST,PUT,PATCH,DELETE,HEAD
auction
intake.prod.pubstack.io/v1/intake/
0
178 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/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.30.80.108 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-30-80-108.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Access-Control-Request-Method
POST
Origin
https://www.giga.de
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Access-Control-Request-Headers
content-type

Response headers

status
204
date
Fri, 28 Feb 2020 10:21:33 GMT
access-control-allow-origin
*
access-control-allow-headers
Origin,Content-Length,Content-Type
access-control-max-age
43200
access-control-allow-methods
GET,POST,PUT,PATCH,DELETE,HEAD
activation
adstax-match.adrtx.net/ Frame 63E2
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.252.24.237 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-34-252-24-237.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash

Request headers

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

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Fri, 28 Feb 2020 10:21:33 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.11
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
auction
intake.prod.pubstack.io/v1/intake/
0
57 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/auction?sId=b090ce7b&c=3
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.30.80.108 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-30-80-108.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Fri, 28 Feb 2020 10:21:33 GMT
error
intake.prod.pubstack.io/v1/intake/
0
57 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/error?sId=b090ce7b&c=1
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.30.80.108 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-30-80-108.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Fri, 28 Feb 2020 10:21:33 GMT
usersync
uss.xplosion.de/
42 B
660 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=480b4494fe340ce3569442613ff79465
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.164.155 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

status
200
date
Fri, 28 Feb 2020 10:21:34 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=1&__id=1582885299643&__it=-60&__ic=727391&__iq=f697e9c47092634dbb44e07a137172f6&__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

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Fri, 28 Feb 2020 10:21:39 GMT
Last-Modified
Sat, 20 Feb 2010 10:20:48 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
Fri, 22 Feb 2013 10:20:48 GMT

Failed requests

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

Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid
Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid
Domain
hbopenbid.pubmatic.com
URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
Domain
prg.smartadserver.com
URL
https://prg.smartadserver.com/prebid/v1
Domain
adx.adform.net
URL
https://adx.adform.net/adx/?rp=4&bWlkPTY2NjQ0MyZ0cmFuc2FjdGlvbklkPWFjOTVmOWM0LTVkZmUtNDc4Ny05ZmNhLTBlODVmOWE3ZDQ5ZQ%3D%3D&bWlkPTcxMzMyNiZ0cmFuc2FjdGlvbklkPWY4ZGRmMDAzLWZlNTYtNGM4MS04NmU2LTFkYmM4MmIzZWIxOA%3D%3D&bWlkPTcwNjE1MSZ0cmFuc2FjdGlvbklkPTM3YzViNWE1LTVhMzUtNDQwMC1hZmM2LTVjM2RkNWRhNjJhMQ%3D%3D&pt=gross&stid=e3de55aa-13c3-4872-89ec-32078f772115&fd=1
Domain
yieldlove-d.openx.net
URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=ac95f9c4-5dfe-4787-9fca-0e85f9a7d49e%2Cf8ddf003-fe56-4c81-86e6-1dbc82b3eb18%2C37c5b5a5-5a35-4400-afc6-5c3dd5da62a1&nocache=1582885279995&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%2C301x601%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle%2Csky%2Cbanner&auid=539390940%2C540714782%2C540847469&
Domain
dmx.districtm.io
URL
https://dmx.districtm.io/b/v1

Verdicts & Comments Add Verdict or Comment

223 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 object| smbadloader string| GoogleAnalyticsObject function| ga function| adLoader object| apstag object| _m6rq object| smbDmpTracking object| dimensions object| dimension10 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 function| requirejs function| require function| define 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| pagespeed object| iam_data object| adsbygoogle object| google_tag_data object| gaplugins object| gaGlobal object| gaData string| type function| sdibgclick object| _ecoconf object| _tfa object| _tscrtlog object| Criteo function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| _extends function| _typeof function| _ 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 boolean| google_plmetrics 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| setImmediate function| clearImmediate object| nativendo_588f272a3e49c_conf boolean| apstagLOADED object| TFASC object| TRC object| _taboola number| taboola_view_id object| TRCImpl function| __trcError function| __trcJSONify object| criteo_pubtag object| _econa function| send function| $ function| jQuery function| isEmpty 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 function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c string| preloadType object| _tblConsole undefined| msg object| _comscore number| _m6rApiLoaded function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| __trcCopyProps function| __trcFromError function| __trcClientTimestamp function| __trcLog function| __trcDebug function| __trcInfo function| __trcWarn function| __trcDOMWalker function| __trcPurgeEventHandlers function| __trcUnJSONify function| __trcGetMargins function| __trcAttachResize function| __trcDetachResize function| __trcTrim function| __trcGetElementsByClass function| __trcToArray function| __trcObjectCreate function| PageManager function| addHashParam function| _calculateEventsLength function| _countDOMNodes function| _countNetworkCalls function| _calculateFPS function| _trackVideoLoadLength function| _trackTimeToFirstUnitElement function| _trackTimeToDisplayImpression function| _trackTimeToPlayerCreation function| _hookToSrcProperty function| _trackTimeToFirstWaterfall number| trc_debug_level string| trc_article_id object| closure_memoize_cache_ object| YLHH object| yieldlove_site_settings object| yieldlove_cmd object| core function| pbjsYLHHChunk object| stroeerCore object| _m6rOnce number| _m6rContainerLoaded object| nativendo_588f272a3e49c_map object| confiant string| sdm_ift function| confiantTryToGetConfig object| trcManager object| trcRbox object| options object| cmTag function| checkOmid3pExist object| de_meetrics undefined| list object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad function| SDG_CookieLayer function| webpackJsonpdkuim object| Base64 boolean| dkuimInited function| udm_ object| ns_p object| COMSCORE object| cp2 function| setUpAgknTag object| Adform function| _h object| _adexc object| adex object| pbstck string| apsrc object| audienceProjectLayer object| _EQLService object| _EQPScript function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr

0 Cookies

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 log URL: https://cdn.taboola.com/libtrc/unip/1092206/tfa.js(Line 3)
Message:
Taboola Pixel: An error occurred while handling command '{"notify":"event","name":"page_view","item-url":"https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/","tim":1582885279616}'. TypeError: Cannot read property 'getItem' of null
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.

15.taboola.com
aax-eu.amazon-adsystem.com
acdn.prod.pubstack.io
ad.yieldlab.net
ads.pubmatic.com
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
adx.adform.net
ajax.googleapis.com
ams.creativecdn.com
api.yieldlove-ad-serving.net
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.districtm.io
cdn.emetriq.de
cdn.m6r.eu
cdn.speedcurve.com
cdn.stroeerdigitalgroup.de
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cds.taboola.com
cm.g.doubleclick.net
confiant-integrations.global.ssl.fastly.net
creativecdn.com
d.agkn.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
dmx.districtm.io
files.giga-video.de
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
imprammp.taboola.com
intake.prod.pubstack.io
irqs.ioam.de
js.adscale.de
js.agkn.com
js.stroeermediabrands.de
lb95.s400.meetrics.net
match.adsrvr.org
match.taboola.com
match.zorosrv.com
maxcdn.bootstrapcdn.com
nugmw.userreport.com
orbidder.otto.de
p.rfihub.com
pagead2.googlesyndication.com
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
sak.userreport.com
sb.scorecardresearch.com
script.ioam.de
securepubads.g.doubleclick.net
server.exposebox.com
si.nuggad.net
ssl-econa.met.vgwort.de
ssl.1.damoh.giga.de
static.criteo.net
static.giga.de
sync.mathtag.com
t.nativendo.de
tpc.googlesyndication.com
track.adform.net
tracking.m6r.eu
trc.taboola.com
u.openx.net
ups.xplosion.de
uss.xplosion.de
videos.giga.de
vidstat.taboola.com
www.dunkirkinception.com
www.facebook.com
www.giga.de
www.google-analytics.com
www.googletagservices.com
www.gstatic.com
www.storygize.net
x.bidswitch.net
xpl.theadex.com
yieldlove-d.openx.net
adx.adform.net
dmx.districtm.io
hbopenbid.pubmatic.com
orbidder.otto.de
prg.smartadserver.com
yieldlove-d.openx.net
104.16.190.66
107.178.241.34
109.71.25.30
13.224.194.102
13.225.73.19
136.243.4.15
141.226.224.32
143.204.101.106
143.204.90.242
148.251.51.163
151.101.113.194
151.101.114.2
151.101.114.217
151.101.114.49
151.101.14.2
151.101.14.49
161.156.66.178
172.217.23.130
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
18.194.124.153
18.194.129.32
18.195.104.209
185.184.8.30
185.29.135.233
185.33.223.209
188.40.16.106
192.132.33.46
193.0.160.129
193.46.63.75
194.213.222.29
2.16.122.151
2.19.33.59
2001:4de0:ac19::1:b:1b
216.58.206.2
23.210.248.245
23.210.249.92
23.37.42.216
23.43.115.95
2600:9000:20eb:7200:19:fc2c:a140:93a1
2600:9000:20eb:d000:1f:a1b:34c0:93a1
2600:9000:2156:200:12:6213:9cc0:93a1
2600:9000:21f3:9000:1c:8c89:a300:93a1
2600:9000:21f3:c400:15:efbc:e300:93a1
2606:4700:20::681a:5fb
2620:1ec:bdf::10
2a00:1450:4001:80b::200a
2a00:1450:4001:814::2003
2a00:1450:4001:817::200a
2a00:1450:4001:819::2001
2a00:1450:4001:819::2002
2a00:1450:4001:81a::200e
2a00:1450:4001:821::2002
2a02:2638:1::3
2a02:26f0:eb:181::5f76
2a03:2880:f12d:83:face:b00c:0:25de
34.252.24.237
34.95.120.147
35.162.160.88
35.186.238.175
35.201.85.158
37.157.4.25
40.113.136.100
46.253.113.178
52.208.216.178
52.219.73.48
52.28.163.206
52.30.80.108
52.49.69.125
52.57.195.246
52.57.208.4
52.95.123.41
54.154.128.203
54.171.36.151
54.246.164.155
69.173.144.138
74.214.194.140
89.163.159.117
91.215.100.40
91.215.103.64
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
0db8c8b58ac001930300be6c24e1f0c4077f69edeb3117432cbd95234f03f179
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0fefd28ff4fcbfa351f4c584974f81f2ff156c74b1ea713a567bc49cbf2cef78
10c830a57fdca6052cc30329c51fd036fbee41f9d82ec8b4365553922ea47f9f
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
121a1f31dd6543e5f3d46ed29fa3a92015f80f555f2c1c4235b8d17d4888bd5f
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
145a92b6ac8f7e283ca3f55fb6f0081e4c38cb4a4dfc81b4cbb2ba2ddc336340
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
22f8fc3249ad9593e80fb8ecda9d9ce5f1372544c48ee9747a5b0fdec4c03251
23de42593f95545fae0d97f983c8d78378ce70042a58c449730406a9dda5339a
246a748c3fedfbc12ca0259b5ab8b5654b4b7f81ffdbfff19f9d5b2bf213027e
261a1dfeeccd3f6747dd6bb49e60579c2582910c2b225d23677772825bf7bc3d
2812530499183a19cfea188845c9b151821722e547ce07d848b6a496f0b43284
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2b97730bb566e975de12ff9ddff705b05dedd494cf4f70c7853f6bfd403703b4
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
31bf8e20e4ce830f5643b0d3af3e0080e797f098196387018d3fd04f046fa04a
34b89c38648d65a020fd24f5542ce53470907ea2166c32733f2e6a91d5e64f65
368409e58e5955c2edffe7050007d98dfdb1c7a0afe8a8eae551734a6057a381
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
3a5e0f7683e69b0fec5c66efac66df080115ffc02129412ee050b06b4ee78ced
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5
46f190baa08195ca3af1de5ad0962db0ef9e010bf279655d1111781c83b7cb11
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4ac552ae33c3b508ee45ba3905936d6fed91e6140c0c156041e796726b9a3a0c
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945
505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
5318e6f99439de8be22212f030c069a25e38feb81952f4fed93121eed1aef3b4
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
553b7035c4df88b88b8903f629f83710ec504f6ed8bb06034be2e68383a149da
5caa5d60bf6b85b392b45fc345204886723bafaa5dd467f76e41a200c626a6c8
5d900e780c1bfffd1d07df8acbd5f2feaf75be4e405a53ec670720340bf2a5c6
5d976ad4578baba7e949ddd9460081a7e8d3cb71976654ef5185e5f2198e441a
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
60fa9d34d5e1b7d6bf0e337cb4aa62f40bcbd6948a2566632b82dac7f18fe5b0
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268
69f049c8296fa63b9a344f13a405b4f6e58432556da4b3e202af9788dae100ea
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6d941ee14efe29bc4859114b4d6c93bd58d9843249a4e9d7603d6f80edb4eadf
6fcf182afcd8adff07093ddefe45b3c6f3b7495f141d14f9dd779f9621a05706
7036c5cd37e467a149892d8d26d5ffc2c5b6724b779f76c79cb65e466ac25a7a
72079e05e49316d0245e16904460e88a8001bfd320327e1de68dac8d12a89114
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
7a8b5f0939260d973c77a0164a212535f4d5a3d69c57732a9f652d34be663e3e
7f4185875bd84924440605027c50aec2e8bd837b9dd90c275595a01955816842
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
816709e9295a4116a9f1648dcdca148a141e0ee263887b39f474a923380e4310
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
85a7c7218d6f1e88384824a99e164b8d8fe7da5c4e0e8f1b340d4225e6bc2feb
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
8ab45573cf6d63b2617a3a6a97af02c584354d0646f4652ea0a72c1ec20adc75
8db3daba71f655f21d2c31ce0a75b09e27e339241b2acd3637580db9a9eb2120
8f0aedeb149fe3b5bf923f3555963bf08ddf19aa1b484491e7119b3ab531c4d7
95ebbe3b755f0749ef26c07fe339baacce6266f4792e0d4cd684d064fa40b2cf
95fb08748cffae2fd954e5c468c2dd22415a054a5756e2501c8a9cbb9ce2adfd
9694d72e65a5b488a1e18d166970ab73de4848e18766fee7634d803cef4cc8f7
96fc3aab6df34ede8189d5c9947377f1af4185dd79c151daa200cb722aa4ca8b
9713194c14931a48facdd9f6fdda5247993f413dd7039e29b392d02aa7082745
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
99c2be35b40e31ffc91be910964e35410991ca48a5f15babf54414bf4a15537f
9a6a842a71b24ad396f378acc12f6ef11455a9134f251abc76b16c22a63d81b8
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a256529bd5b1b8846f8d2536ce7581fb6cea4479992f222d01535903dff48d79
a41b082a5add3cc5754af976d70900d246a3569441d546dfe86a8b6f9f19ae6a
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
a56833ce8542a71a519392f11f8351575830bd5ab43ff6ea30bbcb79dbbf2844
a7019b73cbcf928d42e36f0588c8748254ef15b914690083d80a629943267dcd
a7529a99b9298f983b181abd0097a0314957b556fab14b3cb4547dbefe2a58b0
ac2a58f9d55c4642121cfb6f7e213cbc882bbdd75ef171ca8a07ed982ef693ce
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926
b194e718570b321359cdb523a5ed73b7c396150aaffdc5fece2a3e7659c12605
b304a662c0afc3404a1babc46805ff9f4a6b83a4853721c2e1890940c11c36ff
b53efed83257494f94cfafa511ff9d1755ab652239517dc8f994d593f0d7370e
b59eafb5a2321d7960298052e605dcf7642cbce9b7def89027d7893b380202e4
b5d8661777bb2e8b16d2c80755be1ebcc9b8bbc7fda8232d7267e89b97714724
b6179840b256eabf14abf1359e73f1272a73440f0c64101f0afee0c7deb4e0d9
b7423f3ee15c4bef2886b80f5db2fa16bac4245f4a88d6efbf9c209f66e36817
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb
ba263519f68b1d67e565e36be4ec1f7cb9435e7bbf7984b53a399b99e52c86de
bbac7f4ecd0a368241dadd013f29d57d6754d666988ff371f102af9a7d23a6e1
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c2088d78cab052f661280ebe9df7a1d0d3c3f0c8fcf0e16aa03868b35c1815d9
c66d3c57676253019cfd4315afeead909efc06b27b54a85a6debce549fb1f53e
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d451da75db3f2f7e40b2b960b3cf5489a26e92ff0160ef38acd7db71e013cf56
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
d9d50f91b9fa32568a08b88e9758859316046c7ee530542cf3a7dd6bd334d657
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e76ea1aec186a6f4e42cf26dcdb80f5953a73b3a6d8aa2840fef68746bb8f693
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
ee05db0b0a2b393f70b74c554238d61e8088ed96a37b3ae876bbac53b96420d2
ef06576380441a9c17c71d01fd8c9f26bc90ae41fa77d810acf565c8154244e7
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f0c687bc20b7991aaddc8cab8f750a074af32037bd3dd0661ab547e17baf0468
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f385711a66c1ac4275c8113896dbe6a08b7ff6a18a67c1a69dbf0b86b9edf9b0
f3b71d19cc05d330721309283a4eaaaaafcdea40ba29c66f78260ce4c7e7ac73
f533cac6ff0a803d30d57ac75100058f0e3274334cfb7ee639ea0ba4262a2680
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f8c08be12e015648be6e4b0040898dd78a7b950926792cd750ee70a12930b89c
fda97ec20907646eef81309463a8f352dd07cb189eabb717c66fc1757c8c6f3f